内部struct里面的c ++ vector保持不变

时间:2014-07-21 15:04:56

标签: c++ class vector

非常感谢您花时间回答我的问题! 抱歉,对于我所有的大学学校项目,我习惯使用嵌入式C语言来表达我的错误C ++。

好的,我将发布整段代码,由于您的意见,现在已经修改了。

一些答案​​:

  • 问题是当我不使用" strcmp"我的编译器给了我以下警告:"说明资源路径位置类型 与字符串文字的比较导致未指定的行为[-Waddress] tafel.cpp" 当我输入"结束"它确实表现出一种奇怪的方式退出它并没有停止while循环。 我最初输入的内容(d):见代码

  • 我试图纠正所说的一切。但我确实需要你的tafel :: nieuwebestelling()方法中的tafelnummer静态变量。因为我正在做一个"餐厅计划"。而且这些变量也表示表格编号。例如,如果表1订购5瓶啤酒。载体的含量为5倍啤酒。索引(tafelnummer)将为1.我认为这是开始该计划的好方法。

问题:

--->问题仍然是一样的:首先我去功能" nieuwe bestelling",这允许我填充向量。然后我用toevoegen函数打印矢量但它仍然是空的

代码:

/ *  * tafel.cpp  *创建时间:2014年7月18日  *作者:亚历克斯  * /

#include "../tafel.h"
#include <vector>
#include <string>
#include <iostream>

tafel::tafel() {
    //constr
}

void tafel::nieuwebestelling()
{
        std::string besteld;
        static int tafelnummer=1;

        while(besteld!= "end")
        {
            std::cout<<"bestelling: ";
            std::getline (std::cin,besteld);
            bestellingen[tafelnummer].gerechten.push_back(besteld);
        }
        std::cout<<"---------------------------"<<std::endl;
}
void tafel::toevoegen()
{

    int tafelnummer=1;
    std::cout<<"----------------------------------"<<std::endl;
    std::cout<<"gewijzigd"<<std::endl;

    for(unsigned int i =0; i< bestellingen[tafelnummer].gerechten.size(); i++)
    {
        std::cout<<"i";
        std::cout<< bestellingen[tafelnummer].gerechten[i]<<std::endl;
    }
    std::cout<<"eind"<<std::endl<<std::endl;
    std::cin>>tafelnummer; //This is just here so i can clearly see, the point where everything should be printed
}

/*
 * tafel.h
 *
 *  Created on: 18 Jul 2014
 *      Author: alex
 */

#ifndef TAFEL_H_
#define TAFEL_H_

#define tafels 10

#include <iostream>
#include <vector>
#include <string>


class tafel {
public:
    static int i;
    struct bestelling  //elke tafel heeft een struct waarin alle gerechten enzo in staan. ide struct = ide tafel
    {
        std::vector<std::string>gerechten;
    }bestellingen[tafels];

    tafel();
    void nieuwebestelling();
    void toevoegen();
};


#endif /* TAFEL_H_ */

2 个答案:

答案 0 :(得分:0)

不确定它是如何工作的(除了评论中指出的明显问题),但在我这方面它是有效的。代码如下:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstring>

using namespace std;

const int tafels=16;

class tafel
{
public:
    struct bestelling 
    {
        vector<string>gerechten;  // <-- the vector
    }bestellingen[tafels];

    tafel(){};
    void nieuwebestelling();
    void toevoegen();
    virtual ~tafel(){};
};

void tafel::nieuwebestelling()
{
    char besteld[20]={};
    static int tafelnummer=1;

    while((strcmp(besteld,"end"))!=0)
    {
        cout<<"YOUR ORDER: ";
        cin.getline(besteld,20);
        bestellingen[tafelnummer].gerechten.push_back(besteld);
    }
    cout<<"---------------------------"<<endl;
}

void tafel::toevoegen()
{

    int tafelnummer=1;
    cout<<"THE VECTOR:"<<endl;   //contains what you ordered previously.

    //DOESN T GET PRINTED    
    for(unsigned int i =0; i< bestellingen[tafelnummer].gerechten.size(); i++)
    {
        cout<< bestellingen[tafelnummer].gerechten[i]<<endl;
    }
    cout <<"end"<<endl<<endl; //is printed
}

int main()
{
    tafel foo;
    foo.nieuwebestelling(); 
    foo. toevoegen(); // it prints the vector
}

答案 1 :(得分:0)

首先,您可能希望在问题中发布可编辑的示例代码。

例如,在您发布的代码中,您有一个原始C类数组struct bestelling,它是tafel类的数据成员:bestellingen[tafels]。但tafels定义在哪里?

此外,您的代码质量很低,因为它混合了C-isms和C ++的东西。

例如,为什么要混合std::vector和原始C类数组?

除非有充分的理由不这样做,否则您应该始终将 std::vector 视为C ++中的默认容器,而不是原始的C类数组。

此外,您使用strcmp()来比较字符串,并使用原始char数组来存储字符串。那个糟糕的C ++。只需考虑使用std::string类,它正确地重载operator==进行比较,并且比原始的类C char数组好得多。

换句话说,我建议你从旧的C风格&#34;混合中移植你的代码。和C ++,使用std::vectorstd::string的纯C ++现代代码。 如果您调用std::vector方法,push_back()会自动增长,因此您不需要tafelnummer方法中的static tafel::nieuwebestelling()变量。只需使用std::vector及其push_back()方法向向量添加新内容。

此外,在标头文件中,使用带有std::前缀的完全限定名称,例如std::vector(不是vector)。实际上,头文件中的using namespace std;会污染全局命名空间,这是一种不好的做法。