用于类和结构之间交互的C ++语法

时间:2016-02-24 07:57:04

标签: c++ pointers struct

我在第一学期的C ++中完成了一项作业,我无法弄清楚它的工作语法。我需要使用指针将struct作为参数传递给类函数。我已经复制的这段代码是我最好的尝试,它会编译但是当它要求输入名字时会崩溃。当我尝试语法的变化时,我会得到关于不完整的struct,未定义的变量(warrior是或无效的运算符)的错误。我做错了什么?

#include <iostream>

using namespace std;

class StarWars
{
    public:
        int totalNumber;
        struct data_clone
        {
            int ID, timeCounter;
            string name;
        };
        data_clone *warrior;
        void createClone()
        {
            cout << "How many clone warriors do you want to create in total?" << endl;
            cin >> totalNumber;
        }
        void input(struct data_clone *pointer, int total)
        {

            for(int i = 1; i <= total; i++)
            {
                cout << "For warrior number " << i << ":" << endl;
                cout << "What is the warrior's name?" << endl;
                cin >> pointer[i].name;
                cout << "What is the warrior's ID number?" << endl;
                cin >> pointer[i].ID;
                cout << "What is the warrior's time counter?" << endl;
                cin >> pointer[i].timeCounter;
            }
        }
        void lifeSpan(struct data_clone *pointer, int total)
        {
            for(int i = 1; i <= total; i++)
            {
                cout << "Warrior number " << pointer[i].name << ": " << endl;
                while(pointer[i].timeCounter > 0)
                {
                    cout << "Warrior name: " << pointer[i].name << endl;
                    cout << "Warrior ID number: " << pointer[i].ID << endl;
                    cout << "Warrior time counter: " << pointer[i].timeCounter << endl;
                    cout << "Clone is alive." << endl;
                    pointer[i].timeCounter--;
                }
                cout << "Warrior name: " << pointer[i].name << endl;
                cout << "Warrior ID number: " << pointer[i].ID << endl;
                cout << "Warrior time counter: " << pointer[i].timeCounter << endl;
                cout << "Clone is dead." << endl;
            }
        }


};

int main(void)
{
    StarWars clones;
    clones.createClone();
    clones.input(clones.warrior, clones.totalNumber);
    clones.lifeSpan(clones.warrior, clones.totalNumber);
}

4 个答案:

答案 0 :(得分:0)

你没有初始化内存战士指向,所以你正在使用未经过处理的内存 - 总是一件坏事。这里要记住两件事:

使用指针时,请先将其后面的内存初始化。更喜欢使用RAII概念,如std :: unique_ptr / std :: shared_ptr

void DoStuff(Widget* w);

std::unique_ptr<Widget> pw = std::make_unique<Widget>();
DoStuff(w.get());

使用常规变量时,请使用dereference / reference运算符来获取指向变量的指针。

void DoStuff(Widget* w);

Widget widget;
DoStuff(&w);

答案 1 :(得分:0)

struct data_clone
{
    int ID, timeCounter;
    string name;
};

class StarWars
{
private:
       data_clone *warrior;
       int totalNumber;
    public:
        StarWars()
        {

        }
        ~StarWars()
        {
            delete[] warrior; // clean up 
        }

        void createClone();
        void input();
        void lifeSpan();
  };

void StarWars::createClone()
{
    cout << "How many clone warriors do you want to create in total?" << endl;
    cin >> totalNumber;
    // construct structure baased on input
    warrior = new data_clone[totalNumber];
}

 void StarWars::input()
{

    for(int i = 0; i < totalNumber; i++)
    {
        cout << "For warrior number " << i+1 << ":" << endl;
        cout << "What is the warrior's name?" << endl;
        cin >> warrior[i].name;
        cout << "What is the warrior's ID number?" << endl;
        cin >> warrior[i].ID;
        cout << "What is the warrior's time counter?" << endl;
        cin >> warrior[i].timeCounter;
    }
}

void StarWars::lifeSpan()
{
    std::cout<<"**********Print data**********\n";
    for(int i = 0; i < totalNumber; i++)
    {
        cout << "Warrior number " << warrior[i].name << ": " << endl;
        while(warrior[i].timeCounter > 0)
        {
            cout << "Warrior name: " << warrior[i].name << endl;
            cout << "Warrior ID number: " << warrior[i].ID << endl;
            cout << "Warrior time counter: " << warrior[i].timeCounter << endl;
            cout << "Clone is alive." << endl;
            warrior[i].timeCounter--;
        }
        cout << "Warrior name: " << warrior[i].name << endl;
        cout << "Warrior ID number: " << warrior[i].ID << endl;
        cout << "Warrior time counter: " << warrior[i].timeCounter << endl;
        cout << "Clone is dead." << endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    StarWars clones;
    clones.createClone();
    clones.input();
    clones.lifeSpan();

    return 0;
}

答案 2 :(得分:0)

你从未创建过你的克隆,你只读了应该有多少克隆 为他们分配空间:

void createClone()
{
    cout << "How many clone warriors do you want to create in total?" << endl;
    cin >> totalNumber;
    warrior = new data_clone[totalNumber];
}

您的数组索引也已关闭 - 大小为N的数组从0索引到N - 1

但更常见的处理方法是将金额传递给构造函数并让对象处理自己的成员:

class StarWars
{
public:
    StarWars(int clones)
        : totalNumber(clones),
          warrior(new data_clone[clones])
    {

    }

    void input()
    {
        for(int i = 0; i < totalNumber; i++)
        {
            cout << "For warrior number " << i << ":" << endl;
            cout << "What is the warrior's name?" << endl;
            cin >> warrior[i].name;
            cout << "What is the warrior's ID number?" << endl;
            cin >> warrior[i].ID;
            cout << "What is the warrior's time counter?" << endl;
            cin >> warrior[i].timeCounter;
        }
    }

    void lifeSpan()
    {
        for(int i = 0; i < totalNumber; i++)
        {
            cout << "Warrior number " << i << ": " << endl;
            while(warrior[i].timeCounter > 0)
            {
                cout << "Warrior name: " << warrior[i].name << endl;
                cout << "Warrior ID number: " << warrior[i].ID << endl;
                cout << "Warrior time counter: " << warrior[i].timeCounter << endl;
                cout << "Clone is alive." << endl;
                warrior[i].timeCounter--;
            }
            cout << "Warrior name: " << warrior[i].name << endl;
            cout << "Warrior ID number: " << warrior[i].ID << endl;
            cout << "Warrior time counter: " << warrior[i].timeCounter << endl;
            cout << "Clone is dead." << endl;
        }
    }

private:
    int totalNumber;
    struct data_clone
    {
        int ID, timeCounter;
        string name;
    };
    data_clone *warrior;
};

int main()
{
    int number = 0;
    cout << "How many clone warriors do you want to create in total?" << endl;
    cin >> number;
    StarWars clones(number);
    clones.input();
    clones.lifeSpan();
}

请注意,您还需要正确处理析构函数,复制构造函数和赋值运算符(左侧作为练习)。

答案 3 :(得分:-1)

类StarWars { 私人的:       struct data_clone         {             int ID,timeCounter;             字符串名称;         };

public:
    StarWars()
    {
        warrior = new data_clone[4];
    }
    ~StarWars()
    {
        delete[] warrior;
    }
    int totalNumber;

    data_clone *warrior;
    void createClone()
    {
        cout << "How many clone warriors do you want to create in total?" << endl;
        cin >> totalNumber;
    }
    void input(struct data_clone *pointer, int total)
    {

        for(int i = 0; i < total; i++)
        {
            cout << "For warrior number " << i << ":" << endl;
            cout << "What is the warrior's name?" << endl;
            cin >> pointer[i].name;
            cout << "What is the warrior's ID number?" << endl;
            cin >> pointer[i].ID;
            cout << "What is the warrior's time counter?" << endl;
            cin >> pointer[i].timeCounter;
        }
    }
    void lifeSpan(struct data_clone *pointer, int total)
    {
        for(int i = 0; i < total; i++)
        {
            cout << "Warrior number " << pointer[i].name << ": " << endl;
            while(pointer[i].timeCounter > 0)
            {
                cout << "Warrior name: " << pointer[i].name << endl;
                cout << "Warrior ID number: " << pointer[i].ID << endl;
                cout << "Warrior time counter: " << pointer[i].timeCounter << endl;
                cout << "Clone is alive." << endl;
                pointer[i].timeCounter--;
            }
            cout << "Warrior name: " << pointer[i].name << endl;
            cout << "Warrior ID number: " << pointer[i].ID << endl;
            cout << "Warrior time counter: " << pointer[i].timeCounter << endl;
            cout << "Clone is dead." << endl;
        }
    }

};

注意:我只是硬编码它不是正确的方法,它强迫你只输入4个数据通道 &#34; warrior = new data_clone [4];&#34;

你至少会得到你的结果