push_back получение вектора последнего элемента самим созданным объектом - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь прочитать список животных, работает нормально. Затем я хочу разделить каждую строку на две подстроки для name и cmc, это тоже отлично работает. Но мой cout не работает.

Например, мой animal.txt:

Dog|hi 
cat|miau
cow|hihi

Мой результат for l oop должен выглядеть следующим образом:

Dog
cat
cow

Но на самом деле результат:

cow
cow
cow

Вот мой Animal.cpp:

#include <string>;
#include <vector>;
#include <fstream>;
#include "Animal.h"

using namespace std;

string cmc;
string name;

void Animal();

void Animal(string nameA) {
    name = nameA;
}

void Animal(string nameA, string cmcValue) {
    name = nameCard;
    cmc = cmcValue;
}

void Animal::setName(string names)
{
    name = names;
}

void Animal::setCmc(string cmcvalue) {
    cmc = cmcvalue;
}

std::string Animal::getName() {
    return name;
}

std::string Animal::getCmc() {
    return cmc;
}

void Animal::openfileAnimal() {

    ifstream inFileAnimal;

    inFileAnimal.open("Animals.txt");

    if (inFileAnimal.fail()) {
        cerr << "error open this file" << endl;
        exit(1);
    }

    string itemsAnimal;
    std::vector<Animal> AllAnimals;

    while (getline(inFileAnimal, itemsAnimal)) {
        Animal c;
        string t1 = itemAnimal;
        size_t pos = t1.find("|");
        //name (setname(sub))
        string sub = t1.substr(0, pos);
        c.setName(sub);

        string t2 = t1.substr(sub1.length() + 1, t1.length());
        string sub2 = t2.substr(0, t2.length());

        c.setCmc(sub2);

        AllAnimals.push_back(c);
    }
    for (int i = 0; i < 2; i++) {
        std::cout <<AllAnimals.at(i).getName() << endl;
    }
}

Я читал другие вопросы StackOverflow, подобные моему, но для В моем примере все решения не работают. Так в чем же моя проблема? Думаю, это что-то вроде того, что я изменяю одну и ту же память снова и снова.

1 Ответ

3 голосов
/ 18 июня 2020

У вас есть глобальные переменные вместо членов данных класса:

string cmc;
string name;

void Animal();

void Animal(string nameA) {
    name = nameA;
}

void Animal(string nameA, string cmcValue) {
    name = nameCard;

    cmc = cmcValue;
}

В результате вы сохраняете только самые последние присвоенные значения. Более того, то, что вы, вероятно, рассматриваете как конструктор, вообще не является конструктором. Конструктор должен выглядеть так:

Animal::Animal(string nameA, string cmcValue)
  : name(nameA), cmc(cmcValue) {
}

Обратите внимание, что синтаксис списка инициализации: что позволяет избежать ошибок, подобных вашим.

Кстати, в вашем коде nameCard не определено в все.

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