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

pointer to an object has no any value (or do not get a value)

本文关键字:或者 任何值 指针 对象      更新时间:2023-10-16

我有两个类的输出问题,如下所示:

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
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)){}

问题在于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"。

当您调用时

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

调用以下构造函数:

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

正如您所看到的,第二个参数并没有用于初始化foo成员,而是创建了一个新的参数。它与您用"TestFoo"初始化的对象不同!

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