C++帮助和示例说明
C++ help and explanation of an example
我正在实施关于如何使用库的 LinkedList in my project and this library has an example called ClassList。现在,我已经编程了几年了,但我对 C++ 还很陌生,所以如果我能对几个关于为什么这个例子是这样写的问题得到一些简单的解释,我将不胜感激。
例子的原代码是这样的:
#include <LinkedList.h>
// Let's define a new class
class Animal {
public:
char *name;
bool isMammal;
};
char catname[]="kitty";
char dogname[]="doggie";
char emuname[]="emu";
LinkedList<Animal*> myAnimalList = LinkedList<Animal*>();
void setup()
{
Serial.begin(9600);
Serial.println("Hello!" );
// Create a Cat
Animal *cat = new Animal();
cat->name = catname;
cat->isMammal = true;
// Create a dog
Animal *dog = new Animal();
dog->name = dogname;
dog->isMammal = true;
// Create a emu
Animal *emu = new Animal();
emu->name = emuname;
emu->isMammal = false; // just an example; no offense to pig lovers
// Add animals to list
myAnimalList.add(cat);
myAnimalList.add(emu);
myAnimalList.add(dog);
}
void loop() {
Serial.print("There are ");
Serial.print(myAnimalList.size());
Serial.print(" animals in the list. The mammals are: ");
int current = 0;
Animal *animal;
for(int i = 0; i < myAnimalList.size(); i++){
// Get animal from list
animal = myAnimalList.get(i);
// If its a mammal, then print it's name
if(animal->isMammal){
// Avoid printing spacer on the first element
if(current++)
Serial.print(", ");
// Print animal name
Serial.print(animal->name);
}
}
Serial.println(".");
while (true); // nothing else to do, loop forever
}
然后我尝试在不使用(这么多)指针的情况下修改代码:
#include <LinkedList.h>
// Let's define a new class
class Animal {
public:
char *name;
bool isMammal;
};
char catname[]="kitty";
char dogname[]="doggie";
char emuname[]="emu";
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
void setup()
{
Serial.begin(9600);
Serial.println("Hello!" );
// Create a Cat
Animal cat;
cat.name = catname;
cat.isMammal = true;
// Create a dog
Animal dog;
dog.name = dogname;
dog.isMammal = true;
// Create a emu
Animal emu;
emu.name = emuname;
emu.isMammal = false; // just an example; no offense to pig lovers
// Add animals to list
myAnimalList.add(cat);
myAnimalList.add(emu);
myAnimalList.add(dog);
}
void loop() {
Serial.print("There are ");
Serial.print(myAnimalList.size());
Serial.print(" animals in the list. The mammals are: ");
int current = 0;
Animal *animal;
for(int i = 0; i < myAnimalList.size(); i++){
// Get animal from list
animal = &myAnimalList.get(i);
// If its a mammal, then print it's name
if(animal->isMammal){
// Avoid printing spacer on the first element
if(current++)
Serial.print(", ");
// Print animal name
Serial.print(animal->name);
}
}
Serial.println(".");
while (true); // nothing else to do, loop forever
}
两个版本都可以编译和工作。
所以我的问题是,为什么要在原始示例中使用指向对象的指针,而不是像第二个示例中那样使用对象本身?另外,"right" 处理此事的方法是什么?
我确实理解指针的概念,问题更多是关于为什么和如何。
那么我的第二个问题是,为什么在示例中还提供了一个指针作为成员变量“*name”,而不是 "actual" 成员变量?
最后,我浏览了一些关于 类 在 C++ 中以及如何实例化对象的视频,我注意到有几种方法,人们是如何做的,以及所有这些工作,例如:
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
// or
LinkedList<Animal> myAnimalList();
// or
LinkedList<Animal> myAnimalList;
Animal cat = new Animal();
// or
Animal cat();
// or
Animal cat;
我知道它可能与括号不同,如果构造函数确实需要向它提供参数,但如果我们撇开这一点,这三个示例之间有什么区别吗?
提前感谢您的宝贵时间。
Both versions compile and work just fine. So my question is, why would there be used pointers to the objects in the original example, instead of the objects themselves as in the second example? Also, what is the "right" way to approach this matter? I do understand the concept of pointers, the question is more about why as about how.
没有理由使用指针。你的版本不错
为什么有这么多指点?因为那里有糟糕的程序员。 ;)
原始代码实际上有 3 个内存泄漏。
Then the second question that I have is, why is there in the example provided also a pointer as a member variable "*name" used, and not the "actual" member variable?
char*
是一个指向 char
的指针,一个 C 风格的字符串。如果你有 char
你只会存储一个字符。
实际上,class 应该封装一个适当的字符串类型,该字符串类型拥有它所代表的数据。
is there any difference between these three examples?
是的,非常多:其中两个无法编译。
Animal cat = new Animal();
这会动态分配一个 Animal
,然后尝试从 new
给你的指针复制初始化一个 Animal
。那是无效的。 "real" 代码本来是 Animal* cat = new Animal()
,但这里没有必要使用动态分配。
Animal cat();
这声明了一个名为 cat
的函数返回一个 Animal
。不是你的意思。
最后:
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
这相当于 LinkedList<Animal> myAnimalList;
(好吧,它需要 C++17 之前的可复制性,但没关系)。就这么写出来也没意义。
我正在实施关于如何使用库的 LinkedList in my project and this library has an example called ClassList。现在,我已经编程了几年了,但我对 C++ 还很陌生,所以如果我能对几个关于为什么这个例子是这样写的问题得到一些简单的解释,我将不胜感激。 例子的原代码是这样的:
#include <LinkedList.h>
// Let's define a new class
class Animal {
public:
char *name;
bool isMammal;
};
char catname[]="kitty";
char dogname[]="doggie";
char emuname[]="emu";
LinkedList<Animal*> myAnimalList = LinkedList<Animal*>();
void setup()
{
Serial.begin(9600);
Serial.println("Hello!" );
// Create a Cat
Animal *cat = new Animal();
cat->name = catname;
cat->isMammal = true;
// Create a dog
Animal *dog = new Animal();
dog->name = dogname;
dog->isMammal = true;
// Create a emu
Animal *emu = new Animal();
emu->name = emuname;
emu->isMammal = false; // just an example; no offense to pig lovers
// Add animals to list
myAnimalList.add(cat);
myAnimalList.add(emu);
myAnimalList.add(dog);
}
void loop() {
Serial.print("There are ");
Serial.print(myAnimalList.size());
Serial.print(" animals in the list. The mammals are: ");
int current = 0;
Animal *animal;
for(int i = 0; i < myAnimalList.size(); i++){
// Get animal from list
animal = myAnimalList.get(i);
// If its a mammal, then print it's name
if(animal->isMammal){
// Avoid printing spacer on the first element
if(current++)
Serial.print(", ");
// Print animal name
Serial.print(animal->name);
}
}
Serial.println(".");
while (true); // nothing else to do, loop forever
}
然后我尝试在不使用(这么多)指针的情况下修改代码:
#include <LinkedList.h>
// Let's define a new class
class Animal {
public:
char *name;
bool isMammal;
};
char catname[]="kitty";
char dogname[]="doggie";
char emuname[]="emu";
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
void setup()
{
Serial.begin(9600);
Serial.println("Hello!" );
// Create a Cat
Animal cat;
cat.name = catname;
cat.isMammal = true;
// Create a dog
Animal dog;
dog.name = dogname;
dog.isMammal = true;
// Create a emu
Animal emu;
emu.name = emuname;
emu.isMammal = false; // just an example; no offense to pig lovers
// Add animals to list
myAnimalList.add(cat);
myAnimalList.add(emu);
myAnimalList.add(dog);
}
void loop() {
Serial.print("There are ");
Serial.print(myAnimalList.size());
Serial.print(" animals in the list. The mammals are: ");
int current = 0;
Animal *animal;
for(int i = 0; i < myAnimalList.size(); i++){
// Get animal from list
animal = &myAnimalList.get(i);
// If its a mammal, then print it's name
if(animal->isMammal){
// Avoid printing spacer on the first element
if(current++)
Serial.print(", ");
// Print animal name
Serial.print(animal->name);
}
}
Serial.println(".");
while (true); // nothing else to do, loop forever
}
两个版本都可以编译和工作。 所以我的问题是,为什么要在原始示例中使用指向对象的指针,而不是像第二个示例中那样使用对象本身?另外,"right" 处理此事的方法是什么? 我确实理解指针的概念,问题更多是关于为什么和如何。
那么我的第二个问题是,为什么在示例中还提供了一个指针作为成员变量“*name”,而不是 "actual" 成员变量?
最后,我浏览了一些关于 类 在 C++ 中以及如何实例化对象的视频,我注意到有几种方法,人们是如何做的,以及所有这些工作,例如:
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
// or
LinkedList<Animal> myAnimalList();
// or
LinkedList<Animal> myAnimalList;
Animal cat = new Animal();
// or
Animal cat();
// or
Animal cat;
我知道它可能与括号不同,如果构造函数确实需要向它提供参数,但如果我们撇开这一点,这三个示例之间有什么区别吗?
提前感谢您的宝贵时间。
Both versions compile and work just fine. So my question is, why would there be used pointers to the objects in the original example, instead of the objects themselves as in the second example? Also, what is the "right" way to approach this matter? I do understand the concept of pointers, the question is more about why as about how.
没有理由使用指针。你的版本不错
为什么有这么多指点?因为那里有糟糕的程序员。 ;)
原始代码实际上有 3 个内存泄漏。
Then the second question that I have is, why is there in the example provided also a pointer as a member variable "*name" used, and not the "actual" member variable?
char*
是一个指向 char
的指针,一个 C 风格的字符串。如果你有 char
你只会存储一个字符。
实际上,class 应该封装一个适当的字符串类型,该字符串类型拥有它所代表的数据。
is there any difference between these three examples?
是的,非常多:其中两个无法编译。
Animal cat = new Animal();
这会动态分配一个 Animal
,然后尝试从 new
给你的指针复制初始化一个 Animal
。那是无效的。 "real" 代码本来是 Animal* cat = new Animal()
,但这里没有必要使用动态分配。
Animal cat();
这声明了一个名为 cat
的函数返回一个 Animal
。不是你的意思。
最后:
LinkedList<Animal> myAnimalList = LinkedList<Animal>();
这相当于 LinkedList<Animal> myAnimalList;
(好吧,它需要 C++17 之前的可复制性,但没关系)。就这么写出来也没意义。