C ++在类定义中使用Struct数组的问题

时间:2013-05-01 19:58:04

标签: c++ arrays class struct enums

我目前在尝试在类头文件中创建结构时遇到很多问题。在公共访问者& mutators它说变量是'未声明的标识符',以及我不确定如何从主.cpp文件引用struct数组并将变量从打开的文件分配给struct数组中的元素。

//头文件

#ifndef FOO_H
#define FOO_H
#include <string>
#include <iostream>
using namespace std;

class Foo
{
private:
    struct bag
    {
        string name;
        int amount;
        enum tax { food, medicine } type;
    };
public:
    //Unsure about constructor with enum type
    string getName() const
        { return name; }
    int getAmount() const
        { return amount; }

    void setItem(string);
    void setAmount(int);
    void setTaxCat(int);
};

static const float foodTax = .05, medicineTax = .04;
#endif

//实施文件

#include "Foo.h"
#include <string>
using namespace std;

void Foo::setItem(string item)
{ name = item; }
void Foo::setAmount(int qty)
{ amount = qty; }
void Foo::setTaxCat(int tx)
{ type = static_cast<tax>(tx); }

//主程序

#include "Foo.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    string item;
    int qty;
    int tx;
    ifstream inputFile;
    string fileName;
    const in size = 20;

    cout << "Enter file name: ";
    getline(cin, fileName);
    inputFile.open(fileName.c_str(), ios::in);

    bag items[]  //Unsure how to create array from the struct in the class header file

    for(int index = 0; index < size; index++)
    {
        while(index < size && !inputFile.eof())
        {
            getline(inputFile, item, '#');
            items[index]->setItem(item);  //unsure how to send items to 

            getline(inputFile, qty, '#');
            items[index]->setAmount(qty);

            getline(inputFile, tx, '#');
            items[index]->setTaxCat(tx);
        }
    }
    inputFile.close();
    return 0;
}

这是它引用的文件的一个例子

卵#12#食品

咳嗽#2#药

1 个答案:

答案 0 :(得分:2)

你只声明了bag的定义,但从不创建一个成员。
使包成为像

的成员
    struct bag
    {
        string name;
        int amount;
        enum tax { food, medicine } type;
    } b;
//    ^^

你的方法应该是

string getName() const
    { return b.name; }
int getAmount() const
    { return b.amount; }
...

虽然我会推荐b作为公众成员,以摆脱那些丑陋的吸气者

由于bag类型是私有的,除非你这样做,否则你不能创建它的数组

class Foo {
  friend int main();
  private:
    struct bag {
    ...
    }b;
  ...
};

现在你可以在main中创建一个bag数组,如

Foo::bag items[1000];