2015-09-04 218 views
-1

我是C++类的新手(< 1周),所以请原谅任何误解。将指针传递给另一个类中的新对象(C++)

为了简单起见,我会尽量简化它。我真正的系统有更多的功能和变量,但是我已经把它们排除在外了,所以我可以试着解决我的问题。

我有2个A和B类声明。我在A类中的一个函数是一个返回字符串的getName()函数。我为类A动态分配了对象,并且我相信该程序的规范要求我将该对象的指针传递给类B的对象,以便可以从类B访问getName()函数。我尝试通过使用指向类A的指针在类B中打印名称。以下是我的通用代码解释。

#include <iostream> 

using namespace std; 


class A 
{ 

public: 

    A(string name) 
    { 
     getName(); 
    } 

    string getName() 
    { 
     return name; 
    } 

private: 

    string name; 
}; 


class B 
{ 

public: 

    B(A *objectA) 
    { 
     print(); 
    } 

    void print() 
    { 
     cout << objectA->getName(); 
    } 

private: 

    A *objectA; 

}; 


int main() 
{ 
    A *objectA = new A("nameGoesHere"); 
    B *objectB = new B(objectA); 
} 

此代码是非常普通,但它会导致分段错误11,我不明白为什么。有人可以向我解释这个,也可以提供一个更好的方法来将一个指针传递给一个类,并将它传递给另一个类。提前致谢。

+2

'B'的构造函数永远不会保存它得到的'A *'。 – Michael

回答

1

您需要存储B构造函数接收的指针。

替换为您的乙构造:

B(A *objectA) : objectA(objectA) 
{ 
    print(); 
} 

为了保护分段错误代码,您还可以检查指针不为空。

您可能想在B构造函数中执行并抛出异常,但这取决于系统要求。

0

B的成员变量objectA从不初始化,所以它始终是一个悬挂指针。你可以使用member initializer list将其初始化:

B(A *p) : objectA(p) 
{ 
    print(); 
} 

而且A类的构造函数有相同的问题:

A(const string& s) : name(s) 
{ 
    getName(); 
} 
+1

“一个危险的指针”我喜欢这个,我认为它通常是一个更准确的标签!但正常的术语是_dangling pointer_ :)另外,我会在一些方面说明:如果OP总是需要一个有效的指针(不是'nullptr'-able),它们应该使用引用。如果仍然使用指针,如果在初始化之后永远不需要改变,它们应该将它改为'const'。 –

+1

@underscore_d嗯......这是一个错字。 :) – songyuanyao

0

你忘了初始化类从类B的指针

修改B类构造物:

B(A *objectA_) : objectA(objectA_) 
{ 
    print(); 
} 

objectA(objectA_)“是一个初始化列表。它用你作为参数传递给构造函数的指针初始化你的B :: * objectA。

还有一些更好的解释here