【问题标题】:Call method of a class inside of another C++在另一个 C++ 中调用一个类的方法
【发布时间】:2019-08-11 05:43:34
【问题描述】:

我正在尝试为来自 myClass2(作为中间类)的变量 myVar(位于 myClass1 内)设置一个值。但是我得到一个编译错误。 到目前为止,这是我的尝试:

#include <iostream>
using namespace std;
class myClass1{

    int myVar = 5;
    public:
        myClass1();

        myClass1(int x){ myVar = x; }

        int getmyVar(){ return myVar; }
        void setmyVar(int y){ myVar = y; }


};

class myClass2{

    int myScore = 10;
    myClass1 class1;
public:
    myClass2();

    myClass2(int x){ myScore = x; }

    int getmyScore(){ return myScore; }
    void setmyScore(int y){ myScore = y; }
    myClass1 getmyClass1(){ return class1; }


};

int main(){

    myClass2 class2;
    class2.getmyClass1().setmyVar(40);

    return 0;
}

错误是:

Error 1 error LNK2019: unresolved external symbol "public: __thiscall myClass2::myClass2(void)" (??0myClass2@@QAE@XZ) referenced in function _main C:\Users\Ahmed\Desktop\VB\Test2\Test2\Main.obj Test2

【问题讨论】:

  • 将方法定义改为myClass1& getmyClass1(){...}
  • 顺便说一句,一旦您从getmyClass1 返回引用,将class1 成员设为private 将变得毫无意义。除了使用方法返回(非常量)引用,您也可以将其公开
  • @BoBTFish 我收到此错误:“错误 1 ​​错误 LNK2019:无法解析的外部符号“公共:__thiscall myClass2::myClass2(void)”(??0myClass2@@QAE@XZ) 在函数 _main 中引用C:\Users\Ahmed\Desktop\VB\Test2\Test2\Main.obj Test2"
  • 您忘记定义默认构造函数。如果删除您认为是问题的行,您将遇到同样的错误。
  • @molbdnilo,我需要添加它们吗?我用过 myClass1();和 myClass2();作为能够创建它们的构造函数,它们的属性具有默认值。

标签: c++ visual-studio class methods


【解决方案1】:

查看标记为HERE的更改

#include <iostream>
using namespace std;
class myClass1{

    int myVar = 5;
    public:
    myClass1() {} // HERE

        myClass1(int x){ myVar = x; }

        int getmyVar(){ return myVar; }
        void setmyVar(int y){ myVar = y; }


};

class myClass2{

    int myScore = 10;
    myClass1 class1;
public:
    myClass2() {} // HERE

    myClass2(int x){ myScore = x; }

    int getmyScore(){ return myScore; }
    void setmyScore(int y){ myScore = y; }
    myClass1& getmyClass1(){ return class1; }  // HERE


};

int main(){

    myClass2 class2;
    class2.getmyClass1().setmyVar(40);

    return 0;
}

【讨论】:

  • 非常感谢,所以我想主要问题是我忘了在 myClass2() 和 myClass1() 之后添加 {} 对吧?
  • 问题是这些函数是声明的,而不是定义的。基本上,您说“这个功能应该存在”,但实际上并不存在!另一种解决方案是让它们具有 default 定义:myClass1() = default;
  • 我怀疑你的回答被否决了,因为你没有真正解释问题,或者你的修复工作的原因。一个好的答案将帮助提问者理解,而不仅仅是提供一些东西来复制/粘贴。也就是说,开车投反对票是不礼貌的!
  • 除了没有解释,搞砸了意图并假装被封装时,我不明白反对票;)
  • 我对此有疑问。 myClass1() 和 myClass2() 是构造函数,如果我不定义它们,这是否意味着编译器采用标准构造函数?还是class1和class2不存在?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多