为什么我可以打印动态分配的对象,但不能打印使用 cout <<在堆栈上创建的对象


class Test{
public:
    Test(int _a){a = _a;}
    int a;
};
using namespace std;
int main() {
    Test * first = new Test(3);
    cout << "First is " << first << endl;
//Prints the address of the object, obvious
    Test second(5);
    cout << "Second is " << second << endl;
//Compile time error
    return 0;
}

这听起来可能很荒谬,但为什么我在尝试打印第二个对象时出现此错误?

与"运算符<<不匹配(操作数类型为 "标准::basic_ostream"和"测试")

两个问题:

  1. first是一个指针,你正在输出它的数值,即内存地址。
  2. C++无法知道你想要什么<< second.

您需要正确访问a

// Change
cout << "First is " << first << endl;
cout << "Second is " << second << endl;
// To
cout << "First is " << first->a << endl;
cout << "Second is " << second.a << endl;

查找->.手段和指针。如果您只想访问该类并让它自动输出 a 的值,则需要重载运算符:

class Test{
public:
    Test(int _a){a = _a;}
    friend std::ostream& operator<<(std::ostream& os, const Test& t);
    int a;
};
std::ostream& operator<<(std::ostream& os, const Test& t)
{
    os << t.a;
    return os;
}

最后一件事,您动态创建了first因此请务必在从main返回之前将其删除:

int main()
{
   Test * first = new Test(3);
   // Do the rest of your code here.
   delete first;
   return 0;
}

因为类型不同:

Test* first      = new Test(3);
Test  second(5);

实例first是指针类型 Test*
虽然secondTest的实例。

该标准提供了一个打印指针的operator<<版本,以便解释打印first的原因。

第二个编译失败,因为没有函数声明(或定义):operator<<(std::ostream&, Test const&)。您需要为您的类定义此函数(因为标准不知道您的类,因此不知道如何打印它)。

通常,您将输出运算符定义为类的友元:

class Test{
public:
    Test(int _a){a = _a;}
    int a;
    friend std::ostream& operator<<(std::ostream& s, Test const& data)
    {
        return s << " {" << data.a << "} ";
    }
};

相关内容

  • 没有找到相关文章