Как вернуть экземпляр класса с функцией-членом void? - PullRequest
0 голосов
/ 08 декабря 2018

Итак, я работаю над заданием для школы, включающим занятия и как получить доступ к частным публичным функциям.Насколько я знаю, я должен быть в состоянии установить значения экземпляра класса, который передается в функции.Однако, когда я запускаю программу, она устанавливает значение переменной вне значений, указанных в функции.Мне не разрешено манипулировать файлом заголовка, чтобы изменить значение возвращаемого типа функции.Могу ли я получить подсказку о том, что я делаю неправильно?

Вот определение для функции в классе Location.Как вы можете видеть, у него нет аргументов, и поэтому я не могу поставить return temp;, поэтому программа знает, как его сохранить.

void Location::pick() {
    Location temp;
    srand(time(nullptr));
    int tmp = rand() % fieldSize + 1;


    int tmp = rand() % fieldSize + 1;
    switch (tmp) {
    case 1:
        temp.y = 'a';
        break;
    case 2:
        temp.y = 'b';
        break;
    case 3:
        temp.y = 'c';
        break;
    case 4:
        temp.y = 'd';
        break;
    case 5:
        temp.y = 'e';
        break;
    case 6:
        temp.y = 'f';
        break;
    }

}

Вот прототип класса (если это правильный термин для него)

    class Location {
public:
    Location(); // void constructor, assigns -1 to X coord, and * to Y coord 
    void pick(); // picks a random location
    void fire(); // asks the user to input coordinates of the next shot
    void print() const; // prints location in format "a1"

    // predicate returns true if the two locations match
    friend bool compare(const Location&, const Location&);

private:
    static const int fieldSize = 6; // the field (ocean) is fieldSize X fieldSize
    int x;  // 1 through fieldSize
    char y; // 'a' through fieldSize
};

Вот тестовый код, который я пытаюсь запустить правильно

int main() {

    // srand(time(nullptr)); // random seed
    srand(1); // fixed seed

   //
   // checking location object
   // 

    Location mySpot, userShot;
    mySpot.pick(); // selecting a new random location

    cout << "Randomly selected location is: "; mySpot.print();

    cout << "Input location: ";
    userShot.fire(); // having user input a location

    if (compare(mySpot, userShot))
        cout << "Random location matches user input.\n";
    else
        cout << "Random location does not match user input.\n";
}

При запуске теста устанавливается значение инициализированной переменной «Случайно выбранное местоположение: -858993460╠». Я не понимаю, что я делаю неправильно.Может ли кто-нибудь дать мне подсказку или объяснение?Мой синтаксис неправильный?Это неправильная логика?

Вот все функции, которые я сделал до сих пор, если вы думаете, что проблема в другом месте

#include <iostream>
#include <cstdlib>
#include <cmath>
#include "battleship.h"


using std::cin; using std::cout; using std::endl;


Location::Location() {

    int x = -1;
    char y = '*';

}

void Location::pick() {
    Location temp;
    srand(time(nullptr));
    int tmp = rand() % fieldSize + 1;



    switch (tmp) {
    case 1:
        temp.y = 'a';
        break;
    case 2:
        temp.y = 'b';
        break;
    case 3:
        temp.y = 'c';
        break;
    case 4:
        temp.y = 'd';
        break;
    case 5:
        temp.y = 'e';
        break;
    case 6:
        temp.y = 'f';
        break;
    }

}

void Location::fire() {
    Location loc;
    cout << "Input the location you wish to fire at";


    cin >> loc.x;
    cin >> y;
}

void Location::print()const {
    Location loc;
    int x = loc.x;
    char y = loc.y;

    cout << x << y;


}

bool compare(const Location& a, const Location& b) {

    if (a.x == b.x && a.y == b.y){
        return true;
}
    else return false;


}

1 Ответ

0 голосов
/ 08 декабря 2018

В функции pick() вы создаете еще один объект Location (temp) и присваиваете значения этому объекту.Вам следует назначить значения x и y объекту, вызывающему функцию pick(), а не другому объекту Location, определенному локально в pick().

void Location::pick() {
    srand(time(nullptr));
    int tmp = rand() % fieldSize + 1;

    switch (tmp) {
    case 1:
        this->y = 'a';
        break;
    case 2:
        this->y = 'b';
        break;
    case 3:
        this->y = 'c';
        break;
    case 4:
        this->y = 'd';
        break;
    case 5:
        this->y = 'e';
        break;
    case 6:
        this->y = 'f';
        break;
    }

}

У вас есть та же проблема вфункция print().Вы можете изменить это так:

void Location::print()const {
    cout << this->x << " " << this->y;
}

Указатель this ссылается на текущий объект, который вызвал метод.В вашем случае метод pick() был вызван объектом mySpot, созданным в главной функции.

Дополнительная информация о указателе this: https://www.geeksforgeeks.org/this-pointer-in-c/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...