我想问C++中哪里是实例化实例变量的正确位置?我认为它不应该在类的声明,否则我不`吨贫困面向对象的设计除了看到任何缺点:在C++中实例化实例变量的正确方法
class A{ member m; };
我觉得最好是这样的:
class A{ extern member m; };
但我不`吨知道如何去实现它没有这样一个指针:
class A{ member* m };
A::A(){ m = new member; }
有没有一个“干净的解决方案”,以实现这个堆栈(不使用指针)?
我想问C++中哪里是实例化实例变量的正确位置?我认为它不应该在类的声明,否则我不`吨贫困面向对象的设计除了看到任何缺点:在C++中实例化实例变量的正确方法
class A{ member m; };
我觉得最好是这样的:
class A{ extern member m; };
但我不`吨知道如何去实现它没有这样一个指针:
class A{ member* m };
A::A(){ m = new member; }
有没有一个“干净的解决方案”,以实现这个堆栈(不使用指针)?
您想要使用成员初始化程序:它们是初始化具有需要参数的构造函数的类成员的唯一方法,也是初始化其他类成员的最简洁方法。
如果你有A类和使用构造一个成员M:
class A { member m; }
你想
class A { member m; A(); }
A::A()
: m(<constructor params>)
{
}
你会在你的.h
文件中声明的实例变量:
啊
class A {
public:
A();
private:
int value;
double someOtherValue;
}
可以实例他们在您的.cpp文件像这样:
A.cpp
A::A(): value(5), someOtherValue(10.0)
{
...
}
如果会员目的是通过封闭A
对象进行完全控制,你的第一个例子是做到这一点的正确方法。它的缺点是需要在A
被定义的点处完整定义member
。
您可以查看pimpl idiom以减少耦合,但仍需要基于堆而不是基于堆栈。
我觉得你对如何实例化对象有一个误解。如果你所做的只是声明一个类,那么实际上没有成员变量被实例化。直到你构造一个它的成员变量存在的类的实例。
下面是一个例子来说明,当一个成员对象被实例化:
class ClassA
{
public:
ClassA() { std::cout << "Hello!\n"; }
};
class ClassB
{
public:
ClassA objA;
};
int main()
{
// do some work
ClassB objB; // here, a ClassB object is created, and with it its member ClassA object, so "Hello!" is printed
return 0;
}
至于究竟如何指定要创建什么样的ClassA的对象,而它的构造函数需要的参数,其他的答案做了很好的工作,解释它。
谢谢Sean,你说得对,我误解了C++中的对象是如何实例化的。 – Dudero
我认为它不应该在类的声明,但在其他方面我不`吨除了看到任何缺点贫困面向对象的设计:
class A{ member m; };
在你的心中是什么让这个可怜的OO设计?这是C++中的首选机制。
我觉得最好是这样的:
class A{ extern member m; };
这不是有效的代码。具有存储类规范(如extern
)的合格成员数据是非法的。
但我不`吨知道如何去实现它没有这样一个指针:
class A{ member* m; };
A::A(){ m = new member; }
,将工作,但为什么这样做呢?它看起来像你正试图将Java POV导入到C++中。所有东西都被分配了,所有东西都是Java中的参考。在许多(大多数情况下),没有理由在C++中分配数据成员。它所做的只是添加一个不需要的间接寻址,并添加一个内存可能泄漏的地方。
为什么不在课堂上呢? – mjr
你想达到什么目的? – Nawaz
你能否澄清这个问题?对象内的字段与对象本身一起“实例化”。你的意思是你说的是“班级”还是“静态”的成员? –