在 C++ 类中引用向量

Posted

技术标签:

【中文标题】在 C++ 类中引用向量【英文标题】:Referencing a vectors in a C++ class 【发布时间】:2014-08-06 04:13:26 【问题描述】:

大家好,所以我有以下代码。它是一个简单的项目,我只是想在 C++ 中练习课程等等。程序 semi 可以工作,但我唯一的问题是 printOrder() 应该能够遍历 Flavors 的向量并使用风味中前 4 个字母的子字符串打印出顺序。

现在的问题是向量是空的,所以当我打印订单时.. 没有订单.. 我知道为什么,这是因为我传入的向量没有引用类中的私有向量。我不知道如何在类中引用向量。任何人都可以帮忙吗?我对此很陌生,所以请尽可能详细,可能带有代码示例?我可能已经破坏了这门课的结构,但练习者完美。

提前感谢大家。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>


using namespace std;


    int number_small = 0;
    int number_medium = 0;
    int number_large = 0;
    int counter = 1;
    int vecCount = 1;


    class Order




public:
    //Default
    Order();
    //Paramerterized
    Order(string s, string flav,vector <string>& f)
     

    size = s;
    flavors = flav;
    x = f;


    //Functions

    void getYogurtSize(string s)
       LOOP:
            cout << "Please enter small, medium, or large: ";
            cin >> size;
            //If Statement
            if (size == "small")
               number_small++;
            else if (size == "medium")
               number_medium++;
            else if (size == "large")
               number_large++;
            else       cout << "enter the correct input!\n\n"; 
            goto LOOP; 


     void getYogurtFlavors(string flavor,vector<string> f)
    
        vecCount = 1;
        do
        

            cout << "\nEnter Flavor " << vecCount << ":";
            cin >> flavor;
            if (flavor == "DONE")
            
                break;
            

            f.push_back(flavor);  //Moved after the check to not include DONE
            vecCount++;
         while ((flavor != "DONE") && (vecCount <= 10));
    



void printOrder(vector<string> flavors)

    cout << "Order " << counter << ": ";
    for (auto i : flavors)
        cout << i.substr(0, 4) << "-";
    
    cout << "**";




private:
   //Private Variables
   string size;
   string flavors;  
   vector <string> x;

;


int _tmain(int argc, _TCHAR* argv[])


//Variables
Order ord;
string sz;
string flavor;
string input;
vector <string> f;
const double TAX_RATE = 0.0875;
double subtotal;
double tax;
double total;
const double PRICE_SMALL = 2.19;
const double PRICE_MEDIUM = 3.49;
const double PRICE_LARGE = 4.49;

do



    ord.getYogurtSize(sz);
    ord.getYogurtFlavors(flavor, f);
    ord.printOrder(f);


    cout << "\n\nWould you like to add another order? ";
    counter++;
    cin >> input;
    f.clear();

 


while (input == "yes");

    subtotal = (number_small*PRICE_SMALL) + (number_medium*PRICE_MEDIUM) + (number_large*PRICE_LARGE);
    tax = (subtotal*TAX_RATE);
    total = tax + subtotal;
    cout << "Subtotal: \t$" << fixed << setprecision(2) << subtotal << endl;
    cout << "Tax (8.75%):    $" << fixed << setprecision(2) << tax << endl;
    cout << "Total:   \t$" << fixed << setprecision(2) << total << endl << endl;



return 0;


//Default Constructor
Order::Order()

size = "";
flavors = "";

【问题讨论】:

您是否考虑过使用调试信息和警告进行编译(例如,如果使用g++ -Wall -g,则使用GCC ...)然后使用调试器 .... 问题的本质是,f的向量有两个,一个在class里面,一个在main里面。当您调用getYorgurtFlavors(flavor, f) 时,您传递的是f副本。阅读有关按值传递与按引用传递的信息。 感谢两位提供的信息!我一定会阅读的。我以前学过,但现在我明白了一点。谢谢 【参考方案1】:

您需要通过引用传递f。您的代码将f 的副本传递给getYogourtFlavorsprintOrder。这意味着当您在getYogourtFlavors中修改f时,更改不会反映在调用函数中。

您的方法应该看起来更像这样(注意添加了&amp; 符号):

void getYogurtFlavors(string flavor,vector<string>& f)
...
void printOrder(vector<string>& flavors)

【讨论】:

太棒了!像魅力一样工作。你能推荐任何关于 C++ 类的好读物吗?我很想了解更多关于他们的信息。 从其中之一中选择您的选择 -> ***.com/questions/388242/… 。但是,另一方面,我不知道您是如何学习 C++ 的,但我有一种不好的感觉,它不是一个好的来源(LOOP 分支,例如)。在 C 中,不禁止使用 GOTO,在 C++ 中也不禁止,但强烈不推荐。我的建议?请使用一本好书。

以上是关于在 C++ 类中引用向量的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的“指向对象的指针”向量访问对象

如何在 C++ 中通过引用返回向量

类中的 C++ 类作为自定义向量(如何初始化?)

在 C++ 中引用向量

如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

从基类派生类中 C++ 向量的可访问性