C++和Printing Char中的类



我知道一定遗漏了一些明显的东西,但我在理解类方面仍然有很多困难。我有一个指针,我确信这是错误的,但我不知道怎么做。此外,当我尝试打印其中一个变量时,它只显示第一个字符,而不是同时显示两个字符,我不知道如何解决这个问题。

class Pieces
{
public:
char P1;
char P2;
char P3;
char P4;
char P5;
char P6;
char P7;
char P8;
char P9;
void Board(char P1, char P2, char P3, char P4, char P5, char P6, char P7, char P8, char P9);
void Board();

};
void Pieces::Board()
{
cout << "    A   B   C n";
cout << " 1  B1  B2  B3n";
cout << " 2  .   .   . n";
cout << " 3  W1  W2  W3n";
}
void Pieces::Board(char P1, char P2, char P3, char P4, char P5, char P6, char P7, char P8, char P9)
{
cout << "    A   B   C n";
//cout << " 1  ", P1, "  ", P2, "  ", P3, "n";
cout << P1;
cout << P1;
cout << "n";
//cout << " 2  ", P4, "  ", P5, "  ", P6, "n";
//cout << " 3  ", P7, "  ", P8, "  ", P9, "n";
}
int main()
{
Pieces IDK;
IDK.P1 = *"B1";
IDK.P2 = *"B2";
IDK.P3 = *"B3";
IDK.P4 = *". ";
IDK.P5 = *". ";
IDK.P6 = *". ";
IDK.P7 = *"W1";
IDK.P8 = *"W2";
IDK.P9 = *"W3";
cout << IDK.P1;
IDK.Board();
IDK.Board(IDK.P1, IDK.P2, IDK.P3, IDK.P4, IDK.P5, IDK.P6, IDK.P7, IDK.P8, IDK.P9);
}

我试图让它变得非常简单:

IDK.P1 = *"B1";

在这一行中,将多个字符指定给一个字符。P1属于char类型,它正好包含一个字符。char是一种保存单个字节的类型,意思是一个ASCII编码字符。B1是两个字符。

在C风格的编程中,您可以使用一个不推荐使用的字符数组,该数组指向一个指针(char*)来容纳几个字符。它将是一个以终止符号()结束的数组(存储器中的几个连续值)
但请注意,我写C风格是有原因的——在C++中,你不会使用它。

现在,对于语法*"B1",它的作用是:"B1"从一个指向char数组的指针开始。星星取消了对指针的引用。由于指向数组的指针指向数组的第一个元素,因此取消引用会精确地给出该元素,在您的情况下,该元素包含值B
像这样的语法非常不寻常,我不知道你是如何使用它的。

在任何情况下,在单个char中存储两个字符都是不可能的
您可能只想通过

std::string P1;

在你的课堂上,并像一样分配

IDK.P1 = "B1";

我注意到的另一件事是你的方法

void Pieces::Board(char P1, char P2, char P3, char P4, char P5, char P6, char P7, char P8, char P9)
{
cout << "    A   B   C n";
//cout << " 1  ", P1, "  ", P2, "  ", P3, "n";
cout << P1;
cout << P1;
cout << "n";
//cout << " 2  ", P4, "  ", P5, "  ", P6, "n";
//cout << " 3  ", P7, "  ", P8, "  ", P9, "n";
}

不分配任何值。它所接受的参数在调用后会被遗忘。它不会更改类的成员变量。我怀疑你似乎认为同一个名字=被超越了,如果是这样的话,事实并非如此。


关于此:

char P1;
char P2;
char P3;
char P4;
char P5;
char P6;
char P7;
char P8;
char P9;

如果你写了一个程序,发现你做了一些非常重复的事情,比如这样,那么通常你做的是一种繁琐的方式
在这种情况下,您可以简单地使用一个数组:

std::array<char, 9> P;

然后像一样寻址

Pieces pieces;
pieces.P.at(0) = 'a';

IDK.Board(IDK.P1, IDK.P2, IDK.P3, IDK.P4, IDK.P5, IDK.P6, IDK.P7, IDK.P8, IDK.P9);

这一行是代码中另一个非常奇怪的地方。您使用对象自己的成员变量来调用该对象。它已经知道它自己的成员。此外,Board对于打印数据的东西来说是个坏名字。以操作完成后命名。试试这个:

void工件::print_board(){cout<lt"A B C";;cout<lt"1〃<lt;P1<lt"quot<lt;P2<lt"quot<lt;P3<lt"\n〃;;cout<lt"2〃<lt;P4<lt"quot<lt;P5<lt"quot<lt;P6<lt"\n〃;;cout<lt"3〃<lt;P7<lt"quot<lt;P8<lt"quot<lt;P9<lt"\n〃;;}

(我还在这里用流运算符替换了逗号。)


以下是您的代码返工:

class Board // I renamed it to Board, because that is what it represents
{
public:
Board() {} 
// constructor that already takes in the state of the board,
// using a member initializer list,
// see https://en.cppreference.com/w/cpp/language/constructor
Board(const std::array<std::string, 9>& pieces) : pieces(pieces) {} 
void print() const; // if something prints, let's name it like that
std::array<std::string, 9> pieces;  
};
void Board::print() const
{
// I use for-loops here because while you could do your block right now,
// it would become really cumbersome in a bigger grid

cout << "    A   B   C n";
for(size_t i=0; i<3; i++)
{
cout << " " << (i+1) << "  ";
for(size_t j=0; j<3; j++)
{
cout << pieces.at(i*3+j) << "  ";
}
cout << endl;
}
}
int main()
{
Board board({"B1", "B2", "B3", ". ", ". ", ". ", "W1", "W2", "W3"});
board.print();
/* alternatively:
Board board;
board.pieces.at(0) = "B1";
...
board.print();
*/
}

(试一下:http://www.cpp.sh/4vv3s)

注意,我们可能想要添加一个检查;碎片";长度为2,否则打印会错位。或者更好的做法是,为这些片段使用适当的类型,比如枚举类,以及将其值转换为字符串的函数。

由于这些片段形成了一个网格,我们可能希望使用二维数组std::array<std::array<std::string, 3>, 3> pieces;,以及类似board.pieces.at(0).at(0) = "B1";的访问器。但我暂时没有考虑。

如果需要动态大小,请使用std::vector而不是std::array

char只是放一个字符。如果需要多个字符,可以使用char数组或std::string。当使用双引号"AB"时,它表示常量字符*或常量字符数组。在char类型的变量中只能保留一个字符或1字节的数据。这就是为什么你们只看到第一个角色。您用单引号'A'来描述一个字符。

在板功能中

cout << P1
cout << P2
cout << P3

我不会谈论拼写错误,因为已经有其他答案可以解决它了,我将关注我最大的问题:你没有正确使用类。

一个类的意义在于拥有";可以自己做事情的事情&;所以你不应该不断地给他们所需要的所有数据,你想给他们一次数据,然后再也不用考虑了。对于您的应用程序,您可以这样构建类:

  1. 定义一个可以记住P1..9的类
  2. 为该类定义一个构造函数,在该构造函数中为其提供所有数据
  3. 为该类定义方法,以便打印该类中已有的数据

它可能看起来像这样:

#include <string>
class Board
{
public:
Board();
Board(char P1, char P2, char P3, char P4, char P5, char P6, char P7, char P8, char P9);
void printBoard();
private:
char P1;
char P2;
char P3;
char P4;
char P5;
char P6;
char P7;
char P8;
char P9;
};
Board::Board()
{
P1 = P2 = P3 = P4 = P5 = P6 = P7 = P8 = P9 = 0;
}
Board::Board(char piece1, char piece2, char piece3, char piece4, char piece5, char piece6, char piece7, char piece8, char piece9)
{
P1 = piece1;
P2 = piece2;
P3 = piece3;
P4 = piece4;
P5 = piece5;
P6 = piece6;
P7 = piece7;
P8 = piece8;
P9 = piece9;
}
void Board::printBoard()
{
std::string val;
cout << "    A   B   C n";
val = " 1  ";
if(P1 == 0)
val += "B1";
else
val += std::to_string(P1);
if(P2 == 0)
val += "B2";
else
val += std::to_string(P2);
if(P3 == 0)
val += "B3";
else
val += std::to_string(P3);
val += 'n';
cout << val;

val = " 2  ";
if(P4 == 0)
val += ". ";
else
val += std::to_string(P4);
if(P5 == 0)
val += ". ";
else
val += std::to_string(P5);
if(P6 == 0)
val += ". ";
else
val += std::to_string(P6);
val += 'n';
cout << val;

val = " 3  ";
if(P7 == 0)
val += "W1";
else
val += std::to_string(P7);
if(P8 == 0)
val += "W2";
else
val += std::to_string(P8);
if(P9 == 0)
val += "W3";
else
val += std::to_string(P9);
val += 'n';
cout << val;
}

然后你会这样使用它:

int main ()
{
Board a;
Board b('a','b','c','d','e','f','g','h','i');
a.printBoard();
b.printBoard();
return 0;
}

编辑:尽管我使用了你的方法,但请注意,char数组或std::string对象可以使代码更短、更容易管理。

相关内容

  • 没有找到相关文章

最新更新