【问题标题】:C++ Trying to pass Class to Constructor of Another ClassC ++试图将类传递给另一个类的构造函数
【发布时间】:2020-08-08 22:59:23
【问题描述】:

我有两个类定义,Class1 和 Class2。我需要创建 Class1 的实例,然后将该实例存储在 Class2 的实例中,以便可以从 Class2 实例中访问 Class1 实例。我对 C++ 很陌生,似乎无法做到这一点。

这是我的代码:

main.cpp

#include <iostream>

#include "class_1.h";
#include "class_2.h";

using namespace std;

int main()
{
    cout << "Creating class 1..." << endl;

    // create class1, seems to work fine
    Class1 class1(5);

    cout << "Passing class 1 to class 2..." << endl;

    // i want to create class2, and pass the class1 instance of Class1
    // so it can be stored and accessed by Class2
    Class2 class2(class1);

    return 0;
}

class_1.h

class Class1
{
    private:

    public:

        // some variable we can store and access
        int this_x;

        // constructor
        Class1(int x);
};

class_1.cpp

#include "class_1.h"

// in the constructor set value of this_x to x
Class1::Class1(int x)
{
    this_x = x;
}

class_2.h

#include "class_1.h"

class Class2
{
    private:

        // declare the variable that I want to store Class1 in
        Class1 stored_class;

    public:

        // constructor, will receive a Class1 object instance
        Class2(Class1 store_class_1);

};

class_2.cpp

#include "class_2.h"

// constructor for Class2, takes a Class1 object
Class2::Class2(Class1 storeClass1)
{

    // i want to store storeClass1,
    // but havent got that far yet

    int y = 3;

}

我在文件“class_2.cpp”中遇到错误:

Class2::Class2(Class1 storeClass1)

编译器说

||=== 构建:在链接对象中调试(编译器:GNU GCC 编译器)===| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_2.cpp||在构造函数 'Class2::Class2(Class1)':| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_2.cpp|7|error: no matching function for call to 'Class1::Class1()'| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|18|注意:候选:'Class1::Class1(int)'| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|18|注意:候选人需要 1 个参数,提供 0 个| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|注意:候选:'constexpr Class1::Class1(const Class1&)'| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|注意:候选人需要 1 个参数,0 提供| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|注意:候选:'constexpr Class1::Class1(Class1&&)'| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|注意:候选人需要 1 个参数,0 提供| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_2.cpp|13|警告:未使用的变量 'y' [-Wunused-variable]| C:\Users\Geoff\Desktop\Py Projects\link_objects\main.cpp|3|警告:#include 指令末尾的额外标记| C:\Users\Geoff\Desktop\Py Projects\link_objects\main.cpp|4|警告:#include 指令末尾的额外标记| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|错误:'class Class1'的重新定义| C:\Users\Geoff\Desktop\Py Projects\link_objects\class_1.h|7|注意:'class Class1'的先前定义| ||=== 构建失败:2 个错误,3 个警告(0 分钟,0 秒)===|

我对 C++ 很陌生,我很确定我做的一切都错了......我认为如果我试图将一个结构存储在另一个结构中,我正在做的事情可能会奏效,但是我不明白我做错了什么任何帮助感谢感谢

编辑

感谢您的帮助,我现在似乎可以通过添加标头保护并在 Class2 构造函数中设置 stored_class 属性来使其正常工作。我还想通过 ref 传递,这样我就可以从 class2 中更改 class1。代码如下所示:

main.cpp

#include <iostream>

#include "class_1.h";
#include "class_2.h";

using namespace std;

int main()
{
    cout << "Creating class 1..." << endl;

    // create class1, seems to work fine
    Class1 class1(5);

    cout << "Passing class 1 to class 2..." << endl;

    // i want to create class2, and pass the class1 instance of Class1
    // so it can be stored and accessed by Class2
    Class2 class2(class1);

    cout << "Class 1 this_x from Class 2=" << class2.stored_class.this_x << endl;

    class1.this_x = 4;

    cout << "Class 1 this_x from Class 2=" << class2.stored_class.this_x << endl;

    return 0;
}

class_1.h

#ifndef CLASS_1_H_INCLUDED
#define CLASS_1_H_INCLUDED

class Class1
{
    private:


    public:

        // some variable we can store and access
        int this_x;

        // constructor
        Class1(int x);

};

#endif // CLASS_1_H_INCLUDED

class_1.cpp

#include "class_1.h"

// in the constructor set value of this_x to x
Class1::Class1(int x)
{
    this_x = x;
}

class_2.h

#ifndef CLASS_2_H_INCLUDED
#define CLASS_2_H_INCLUDED

#include "class_1.h"

class Class2
{
    private:

    public:

        // constructor, will receive a Class1 object instance
        Class2(Class1 &store_class_1);

        // declare the variable that I want to store Class1 in
        Class1 &stored_class;

};

#endif // CLASS_2_H_INCLUDED

class_2.cpp

#include "class_2.h"

// constructor for Class2, takes a Class1 object
Class2::Class2(Class1 &storeClass1): stored_class(storeClass1) {}

问题:

根据此处https://www.w3schools.com/cpp/cpp_constructors.asp 的示例,他们使用不同样式的代码来设置成员变量。当我在 class_2.cpp 中尝试这个时,怎么会出错?我认为这种格式会更好,所以我可以在 Class2 构造函数中做更多的事情?

Class2::Class2(Class1 &storeClass1) {
    stored_class = storeClass1;
}

【问题讨论】:

  • 1) 将include guards 添加到您的标题中。 2) 初始化构造函数初始化列表中的成员,如Class2::Class2(Class1 storeClass1) : stored_class(storeClass1) {...}

标签: c++


【解决方案1】:
    // declare the variable that I want to store Class1 in
    Class1 stored_class;

您有一个名为stored_class1 的班级成员。现在,让我们看看你的构造函数:

Class2::Class2(Class1 storeClass1)
{

此构造函数无法初始化 stored_class 成员。它确实有一个Class1 参数。这很好,但仅仅因为构造函数有参数并不意味着构造函数会自动初始化相同类型的类成员。你自己负责这样做:

Class2::Class2(Class1 storeClass1)
       : stored_class{storeClass1}
{

【讨论】:

  • 感谢您的帮助!我进行了建议的更改,现在似乎可以使用,尽管我还有 1 个问题,请参阅我所做的编辑的底部。我不明白为什么我不能那样设置类属性,以及为什么在构造函数中完全需要设置类属性?在此示例中为w3schools.com/cpp/…。他们直到实例化对象后才设置它。再次感谢
  • @GeoffL 因为那是一个变量,而不是字段初始化。
  • 我想也是因为我路过 ref?谢谢
  • 不,通过引用传递与它无关,无论如何。构造函数负责初始化一个类成员。如果构造函数没有初始化类成员,它必须有一个默认构造函数。 Class1 没有默认构造函数,因此必须在构造函数的初始化部分对其进行初始化。在构造函数中为类成员分配一些东西与初始化它不是一回事。该示例中使用的类具有默认构造函数。结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多