Я пытаюсь установить значение для переменной myVar (находится внутри myClass1) из myClass2 (как промежуточный класс). Однако я получаю ошибку компиляции. Вот моя попытка:
#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
Кстати, как только вы вернете ссылку из getmyClass1, становится довольно бессмысленно делать class1 участником private. Вместо того, чтобы использовать метод для возврата (неконстантной) ссылки, вы также можете сделать ее общедоступной.
@BoBTFish Я получаю эту ошибку: «Ошибка 1, ошибка LNK2019: неразрешенный внешний символ «public: __thiscall myClass2::myClass2(void)» (??0myClass2@@QAE@XZ), на который ссылается функция _main C:\Users\Ahmed\Desktop \VB\Test2\Test2\Main.obj Test2 "
Вы забыли определить конструкторы по умолчанию. Вы столкнетесь с той же ошибкой, если удалите строку, которая, по вашему мнению, является проблемой.
@molbdnilo, мне нужно их добавить? Я использовал myClass1(); и мойКласс2(); как конструктор, чтобы иметь возможность их создавать, их атрибуты имеют значения по умолчанию.
Это декларации, а не определения. Тело функции, которое ничего не делает, выглядит как {}, а не как ;.





См. изменения, отмеченные 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(), верно?
Проблема в том, что эти функции объявлен, а не определенный. По сути, вы говорите, что «эта функция должна существовать», но на самом деле ее нет! Другим решением было бы сделать их определениями По умолчанию: myClass1() = default;
Я подозреваю, что ваш ответ получает отрицательные голоса, потому что вы на самом деле не объясняете проблему или причину, по которой ваше исправление работает. Хороший ответ поможет спрашивающему понять, а не просто дать что-то для копирования/вставки. Тем не менее, это дурные манеры - прогонять минус!
кроме отсутствия объяснений, испорченного намерения и притворства инкапсулированным, когда это не так, я не понимаю отрицательных голосов;)
У меня есть вопрос об этом. myClass1() и myClass2() - это конструктор, если я их не определю, будет ли это означать, что компилятор берет стандартный конструктор? Или class1 и class2 не существует?
@Ahrtaler объявление похоже на обещание компилятору, что вы предоставите определение, исключение состоит в том, чтобы указать его как = default, и в этом случае компилятор все равно предоставит определение
@ user463035818 Мой компилятор не выдает ошибку, если я создаю конструктор без определения. Проверил это секунду назад. Но я не проверял, что произойдет, если я вызову этот конструктор. Я думаю, что результатом будет исключение времени выполнения. Но я не уверен в этом.
@Ahrtaler, если вы его не называете, нет проблем, определение и объявление могут быть в разных местах. Если вы назовете это, вы получите ошибку компоновщика (та, которую вы получили в своем примере выше, действительно не понимаете, почему вы думаете, что вам нужно снова протестировать;)
@user463035818 user463035818 О, я не видел эту ошибку ссылки. Да, это имеет смысл.
Измените определение метода на myClass1& getmyClass1(){...}