1

我正在学习 c++ 中的类和对象,并尝试了以下代码来测试我是否正确理解它:

#include <iostream>

using namespace std;

class class1
{
    public:
        void write(int x)
        {
             dataObject.var = x;
        }
};

class class2
{
    public:
        void read()
        {
            std::cout << dataObject.var;
        }
};

class data
{
    public:
        int var;
        data()
        {
            var = 1;
        }
};

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;


    object2.read(data dataObject);
    object1.write(2);
    object2.read(data dataObject);

    return 0;
}

这是两个对象都用于修改和使用第三个的成员,但我收到以下错误:

In member function 'void class1::write(int)':
line 10: error: 'dataObject' was not declared in this scope

In member function 'void class2::read()':
line 14: error: 'dataObject' was not declared in this scope

In function 'int main()':
line 40 + 42: error: expected primary-expression before 'dataObject'

知道我哪里出错了吗?提前致谢。

编辑:感谢所有建议。我现在的代码是:

#include <iostream>

using namespace std;

class class1
{
    public:
        void write(data &dataObject, int x)
        {
            dataObject.var = x;
        }

};

class class2
{
    public:
        void read(data dataObject)
        {
            std::cout << dataObject.var << endl;
        }
};

class data
{
    public:
        int var;
        data()
        {
            var = 1;
        }
};

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;


    object2.read(dataObject);
    object1.write(dataObject,2);
    object2.read(dataObject);

    return 0;
}    

我现在得到错误:

8 错误:“数据”尚未声明

10 错误:在“dataObject”中请求成员“var”,它是非类类型“int”

18 错误:“数据”尚未声明

20 错误:请求“dataObject”中的成员“var”,它是非类类型“int”

40 错误:“dataObject”未在此范围内声明

4

3 回答 3

5

在这一点上,您出错的地方是:

    void write(int x)
    {
         dataObject.var = x;
    }

没有dataObject。你试图让你的类依赖于一些全局对象。首先,你必须决定你是否真的想要这个。如果你这样做了,你需要一种方法来确保这些全局对象在它们被类使用之前被声明和实例化。

有很多方法可以修复错误,但首先您需要清楚您希望这些类做什么以及它们应该如何相互交互。

如何在没有全局对象的情况下解决此问题的一个示例:

class class1
{
  public:
    class1(data& dataObj) : dataRef_(dataObj) {}
    void write(int x)
    {
      dataRef_.var = x;
    }
  private:
    data& dataRef_;
};

然后主要是:

int main()
{
  data dataObject;
  class1 object1(dataObject);
  object1.write(2);
}
于 2012-08-11T18:36:30.223 回答
3

您的班级不知道该变量dataObject。如果您希望它们能够访问类的实例,data则需要将它们传递给您的函数。像这样重新定义函数

 void read(const data& dataObject)
 {
     std::cout << dataObject.var;
 }

data或者如果您希望能够做到这一点,则在您的类中有一个类的成员变量。从设计的角度来看,您的类除了作用于类数据的实例之外不做任何事情。您可以将这两个类组合成一个包含类对象data作为成员变量的新类。您可以拥有该新类的多个功能(读/写)来为内部data成员进行修改/输出。拥有 2 个单独的类,它们的唯一目的是修改另一个不是成员变量的变量,这真的没有意义。

于 2012-08-11T18:36:40.227 回答
0

您将参数传递给成员函数readand write,但这些函数未定义为接受参数。

将它们重新定义为:

// for class1:
void write(data &dataObject, int x)
{
     dataObject.var = x;
}

// for class2:
void read(data dataObject)
{
    std::cout << dataObject.var << endl;
}

此外,当你传递这些对象时,不要在它们前面加上 type data:你已经声明了变量,现在你只需要:

int main()
{
    data dataObject;
    class1 object1;
    class2 object2;

    object2.read(dataObject);
    object1.write(dataObject, 2);
    object2.read(dataObject);
}
于 2012-08-11T18:42:46.553 回答