提问者:小点点

从另一个类访问另一个类时遇到的问题


我刚开始学习C++,我正在尝试C++中的新东西,我想尝试的是从另一个类中访问另一个类,改变它的实例,然后在屏幕上打印它的实例。

我想知道2件事1)我的代码有什么问题2)我应该在哪里声明类声明(在主文件还是类定义文件?)

这是错误日志-

'object::carrier' uses undefined class 'sub'
 'cout': is not a member of 'std'
 'cout': undeclared identifier

这就是我想到的-source.h

#include <iostream>
#include <vector>
#include "stuff.h"

int main()
{
    object spoon(3);
    spoon.get();

}

stuff.cpp

#pragma once
#include <vector>
class object;
class sub;


class object
{
private:
    std::vector <sub> thing;
public:
    object(int n);
    void get() const;
};


class sub
{
private:
    int num;
public:
    void set_num(int n);

};

stuff.cpp

#include <vector>
#include "stuff.h"

// methods for object
object::object(int n)
{
    sub carrier;
    carrier.set_num(n);
}

void object::get() const
{
    std::cout << carrier.num;
}

// methods for sub




void sub::set_num(int temp_num)
{
    num = temp_num;
}

谢谢


共1个答案

匿名用户

object类中,特别是object::get定义中,您使用变量carrier而不在作用域中。

当您在构造函数中声明变量sub carrier时,它只能在相同的作用域中访问,即在构造函数内部。 一旦您的程序离开作用域,变量carrier将被释放(删除)。

必须将变量sub carrier作为成员添加到类中,如下所示:

class object
{
private:
  sub carrier

  // other stuff
}

编辑:我所以你编辑了你的问题。

您必须用std::cout替换cout,因为cout是C++标准库的一部分。 或者,一个不那么冗长的选项是在每个.cpp文件的顶部添加使用名称空间std;的。 这基本上告诉编译器,您可以使用名称空间std,而无需显式地说明它。 但不要对.h文件执行此操作。 这可不是个好主意。