Вызов метода класса внутри другого C++

Я пытаюсь установить значение для переменной 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

Измените определение метода на myClass1& getmyClass1(){...}

Max 20.03.2019 14:54

Кстати, как только вы вернете ссылку из getmyClass1, становится довольно бессмысленно делать class1 участником private. Вместо того, чтобы использовать метод для возврата (неконстантной) ссылки, вы также можете сделать ее общедоступной.

463035818_is_not_a_number 20.03.2019 14:55

@BoBTFish Я получаю эту ошибку: «Ошибка 1, ошибка LNK2019: неразрешенный внешний символ «public: __thiscall myClass2::myClass2(void)» (??0myClass2@@QAE@XZ), на который ссылается функция _main C:\Users\Ahmed\Desktop \VB\Test2\Test2\Main.obj Test2 "

محمد خير الخلق 20.03.2019 14:55

Вы забыли определить конструкторы по умолчанию. Вы столкнетесь с той же ошибкой, если удалите строку, которая, по вашему мнению, является проблемой.

molbdnilo 20.03.2019 14:56

@molbdnilo, мне нужно их добавить? Я использовал myClass1(); и мойКласс2(); как конструктор, чтобы иметь возможность их создавать, их атрибуты имеют значения по умолчанию.

محمد خير الخلق 20.03.2019 14:58

Это декларации, а не определения. Тело функции, которое ничего не делает, выглядит как {}, а не как ;.

molbdnilo 20.03.2019 14:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
69
1

Ответы 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(), верно?

محمد خير الخلق 20.03.2019 15:04

Проблема в том, что эти функции объявлен, а не определенный. По сути, вы говорите, что «эта функция должна существовать», но на самом деле ее нет! Другим решением было бы сделать их определениями По умолчанию: myClass1() = default;

BoBTFish 20.03.2019 15:06

Я подозреваю, что ваш ответ получает отрицательные голоса, потому что вы на самом деле не объясняете проблему или причину, по которой ваше исправление работает. Хороший ответ поможет спрашивающему понять, а не просто дать что-то для копирования/вставки. Тем не менее, это дурные манеры - прогонять минус!

BoBTFish 20.03.2019 15:09

кроме отсутствия объяснений, испорченного намерения и притворства инкапсулированным, когда это не так, я не понимаю отрицательных голосов;)

463035818_is_not_a_number 20.03.2019 15:09

У меня есть вопрос об этом. myClass1() и myClass2() - это конструктор, если я их не определю, будет ли это означать, что компилятор берет стандартный конструктор? Или class1 и class2 не существует?

NelDav 20.03.2019 15:10

@Ahrtaler объявление похоже на обещание компилятору, что вы предоставите определение, исключение состоит в том, чтобы указать его как = default, и в этом случае компилятор все равно предоставит определение

463035818_is_not_a_number 20.03.2019 15:11

@ user463035818 Мой компилятор не выдает ошибку, если я создаю конструктор без определения. Проверил это секунду назад. Но я не проверял, что произойдет, если я вызову этот конструктор. Я думаю, что результатом будет исключение времени выполнения. Но я не уверен в этом.

NelDav 20.03.2019 15:18

@Ahrtaler, если вы его не называете, нет проблем, определение и объявление могут быть в разных местах. Если вы назовете это, вы получите ошибку компоновщика (та, которую вы получили в своем примере выше, действительно не понимаете, почему вы думаете, что вам нужно снова протестировать;)

463035818_is_not_a_number 20.03.2019 15:19

@user463035818 user463035818 О, я не видел эту ошибку ссылки. Да, это имеет смысл.

NelDav 20.03.2019 15:21

Другие вопросы по теме