2011-07-18 90 views
1

我想问C++中哪里是实例化实例变量的正确位置?我认为它不应该在类的声明,否则我不`吨贫困面向对象的设计除了看到任何缺点:在C++中实例化实例变量的正确方法

class A{ member m; };

我觉得最好是这样的:

class A{ extern member m; };

但我不`吨知道如何去实现它没有这样一个指针:

class A{ member* m };

A::A(){ m = new member; }

有没有一个“干净的解决方案”,以实现这个堆栈(不使用指针)?

+0

为什么不在课堂上呢? – mjr

+0

你想达到什么目的? – Nawaz

+0

你能否澄清这个问题?对象内的字段与对象本身一起“实例化”。你的意思是你说的是“班级”还是“静态”的成员? –

回答

6

您可以使用构造函数初始化列表根据需要构造所有成员变量。

A::A(const member& memberArg) 
    : m(memberArg) 
{ } 

this获取更多信息。

+0

你的意思是'class A {member m; };'然后''member m;'... A :: A():m(m){}' – Dudero

+2

最好使参数为'const member&'。 – Nawaz

+0

是的,这就是我的意思。 C++中的一个实例变量就是这样的:class A {member m; };' – sergio

0

您想要使用成员初始化程序:它们是初始化具有需要参数的构造函数的类成员的唯一方法,也是初始化其他类成员的最简洁方法。

如果你有A类和使用构造一个成员M:

class A { member m; } 

你想

class A { member m; A(); } 

A::A() 
: m(<constructor params>) 
{ 
} 
0

你会在你的.h文件中声明的实例变量:

class A { 

    public: 
     A(); 
    private: 
     int value; 
     double someOtherValue; 
} 

可以实例他们在您的.cpp文件像这样:

A.cpp

A::A(): value(5), someOtherValue(10.0) 
{ 
    ... 
} 
0

如果会员目的是通过封闭A对象进行完全控制,你的第一个例子是做到这一点的正确方法。它的缺点是需要在A被定义的点处完整定义member

您可以查看pimpl idiom以减少耦合,但仍需要基于堆而不是基于堆栈。

3

我觉得你对如何实例化对象有一个误解。如果你所做的只是声明一个类,那么实际上没有成员变量被实例化。直到你构造一个它的成员变量存在的类的实例。

下面是一个例子来说明,当一个成员对象被实例化:

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的对象,而它的构造函数需要的参数,其他的答案做了很好的工作,解释它。

+0

谢谢Sean,你说得对,我误解了C++中的对象是如何实例化的。 – Dudero

1

我认为它不应该在类的声明,但在其他方面我不`吨除了看到任何缺点贫困面向对象的设计:

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++中分配数据成员。它所做的只是添加一个不需要的间接寻址,并添加一个内存可能泄漏的地方。