打印出结构数组的元素

时间:2015-03-02 01:40:35

标签: c++ arrays struct

我似乎无法弄清楚我做错了什么......我正在编写一个程序来玩游戏quatro,这是一种类似于tic tac tow的棋盘游戏。在游戏中他们是16件独特的作品,每件作品都有四个“特征”。 (高或短,黑色或白色,空心或填充,方形或圆形)

我创建了一个结构“片段”,其中“traits”是一个成员。我将特征称为W为白色,T为高,H或空心....

无论如何,我只是想创建一个包含所有可用部分的数组,并将它们显示在一个单独的按比例缩小的程序中。但是我似乎无法打印出可用数组的元素。

我得到的错误是

错误:与'operator<<'不匹配在std:cout<<可用的[0]'

这是我现在正在尝试的......

#include <iostream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <algorithm>

using namespace std;

struct Pieces{

string traits;

};

int main()
{
  Pieces p1;
p1.traits = "WSHR";

Pieces p2;
p2.traits = "BSHR";

Pieces p3;
p3.traits = "WTHR";

Pieces p4;
p4.traits = "BTHR";

Pieces available [4] = {p1.traits,p2.traits,p3.traits,p4.traits};

cout << available[0];


return 0;

}

我添加了一堆库,希望这是问题所在。当我取消引用可用的数组(&amp; available [0])时,地址打印出来,但我似乎无法弄清楚如何在数组的第一个插槽中打印该值。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

  

错误:不匹配&#39;运营商&lt;&lt;&lt;&#39;在std:cout&lt;&lt;可用的[0]&#39;

您必须定义std::ostream& operator(std::ostream&, const Pieces&)运算符才能直接打印Pieces

std::ostream& operator(std::ostream& os, const Pieces& pcs) {
    os << pcs.traits;
    return os;
}

或者,您只需直接从traits输出struct Pieces成员:

std::cout << available[0].traits;

答案 1 :(得分:1)

因为数组available包含Pieces类型的对象,而cout << available[0]您尝试将Pieces对象传递给operator<< { {1}}。

std::cout类型的cout::operator<<并未超载,因此它不知道该怎么做。

重载Pieces [1] 或者只是输出该结构中的字符串:

operator<<

[1] 请参阅πάντα ῥεῖ的答案。

答案 2 :(得分:-1)

您应该重载'&lt;&lt;&lt;'运算符(输出流运算符),或输出'traits'成员。此外,您可以使用自定义构造函数使它们更容易初始化,甚至使用std :: vector容器:

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

using namespace std;

struct Pieces{
    Pieces(){} // default c'tor
    Pieces(const string& t)
        : traits(t) {}

    string traits;

    friend ostream& operator<< (ostream& stream, const Pieces& p);
};

// overload the output stream operator for convenience
ostream& operator<< (ostream& stream, const Pieces& p)
{
    stream << p.traits;
    return stream;
}


int main()
{
    Pieces p1("WSHR");  // neater if you write a constructor overload that inits the contents
    Pieces p2("BSHR");
    Pieces p3("WTHR");
    Pieces p4("BTHR");

    Pieces available[4] = { p1, p2, p3, p4 };
    // Or you could init the elements directly in the array; 
    Pieces a2[1] = { Pieces("WSHR") };

    cout << available[0] << endl; 

    // This is my favorite way to declare and init the array
    vector<Pieces> avail = { Pieces("WSHR"), Pieces("BSHR"), Pieces("WTHR"), Pieces("BTHR") };
    cout << avail[0] << endl;
}