指向对象的指针没有任何值(或者没有得到值)

时间:2016-07-29 04:23:58

标签: c++ class pointers

我输出2个类的问题如下:

foo.h中

public:
    Foo(){} ;
    Foo(string);
    Foo(const Foo&);
    string getFooName() const;
    ~Foo();
private:
    string foo;

Foo.cpp中

Foo::Foo(string n):foo(n){
}

Foo::Foo(const Foo &f):foo(f.foo){
}

string Foo::getFooName() const{
    return foo;
}

Foo::~Foo(){
}

和班级栏:

Bar.h

public:
    Bar();
    Bar(string, Foo&);
    Bar(const Bar&);
    Foo& getFoo() const;
    ~Bar();
private:
    string bar;
    Foo* foo;
};

Bar.cpp

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){
}

Bar::Bar(const Bar &b):bar(b.bar), foo(new Foo(*b.foo)){
}

Foo &Bar::getFoo() const{
 return *foo;
}

Bar::~Bar()
{
delete foo;
}

并且在主要功能中,当我使用此cout<<"Test:"<<b->getFoo().getFooName();时,它仅使我输出Test:而不是Test:TestFoo

我的代码有什么问题? (gcc5.4.0,cmake 3.5.1) TNX

和main.cpp

Foo* f;
Bar* b;
f=new Foo("TestFoo");
b=new Bar("TestBar",*f);  
cout<<"Test:"<<b->getFoo().getFooName(); // this line

3 个答案:

答案 0 :(得分:4)

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){}

参数f未使用。您需要将其传递给Foo构造函数。

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo(f)){}

答案 1 :(得分:1)

致电时

b = new Bar("TestBar", *f);  

调用以下构造函数:

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo())

如您所见,第二个参数不用于初始化foo成员,而是创建一个新成员。它与您使用“TestFoo”初始化的对象不同!

因此,当您打印时,根本不会返回“TestFoo”。

答案 2 :(得分:1)

问题在于Bar.cpp

Bar的第一个构造函数是

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo()){
}

这告诉编译器创建一个指向要存储在Foo对象中的新Bar对象的指针。但是,新的Foo对象与作为构造函数的输入传递的Foo对象无关。构造函数需要使用作为输入传递的Foo对象,以便新的Foo对象在成员变量foo中具有相同的值:

Bar::Bar(string b, Foo &f):bar(b), foo(new Foo(f.foo)){
}

然后,构造函数调用

b=new Bar("TestBar",*f); 
main.cpp中的

实际上会为成员变量foo分配一个“TestFoo”值(而在它没有初始化变量之前)。

因此,b->getFoo().getFooName()应根据需要返回“TestFoo”。