C++ 构造函数c+内的setters函数+;
我试图在构造函数中使用setter函数,这是我以前从未做过的。它给了我以下错误:C++ 构造函数c+内的setters函数+;,c++,constructor,C++,Constructor,我试图在构造函数中使用setter函数,这是我以前从未做过的。它给了我以下错误: [Error]对“(笔记本电脑)(常量字符[5],常量字符[3],int,int)”的调用不匹配 我也需要编写setter函数吗?我是说在建造师之外?我的意思是像这样 void Laptop::setBrand(char a[]) { brand=a;} 我认为错误在第二个构造函数中,它包含四个参数,但我找不到它 代码如下: #include <iostream> #inc
[Error]对“(笔记本电脑)(常量字符[5],常量字符[3],int,int)”的调用不匹配
我也需要编写setter函数吗?我是说在建造师之外?我的意思是像这样
void Laptop::setBrand(char a[])
{
brand=a;}
我认为错误在第二个构造函数中,它包含四个参数,但我找不到它
代码如下:
#include <iostream>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
using namespace std;
class Laptop{
private:
char brand[10];
char processor[10];
int ram;
int hardDrive;
public:
void setBrand(char Bra[]);
void setProcessor(char Pro[]);
void setRam(int Ram);
void setHardDrive(int HDrive);
char *getBrand();
char *getProcessor();
int getRam();
int getHardDrive();
Laptop();
Laptop(char [],char [],int ,int );
};
Laptop::Laptop(){
cout<<"Default constructor called...\n";
strcpy(brand,"None");
strcpy(processor,"None);
ram=0;
hardDrive=0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
班级笔记本电脑{
私人:
char品牌[10];
字符处理器[10];
内存;
int硬盘;
公众:
void-setBrand(char-Bra[]);
void setProcessor(char Pro[]);
无效设置Ram(内部Ram);
无效设置硬盘驱动器(内部硬盘驱动器);
char*getBrand();
char*getProcessor();
int getRam();
int getHardDrive();
笔记本电脑();
笔记本电脑(字符[],字符[],整数,整数);
};
笔记本电脑::笔记本电脑(){
cout您正在传递两个const char*
作为参数,因此您应该更改此参数:
Laptop::Laptop(char-Bra[],char-Pro[],int-Ram,int-HDrive)
为此:
Laptop::Laptop(const char*、const char*、int-Ram、int-HDrive)
这里有很多错误
Laptop laptopObj1,laptopObj2;
...
laptopObj2("Dell","i5", 4, 500);
您不能使用构造函数两次。您在第一行中为这两个对象使用了构造函数Laptop()
,然后尝试为laptobj2
使用第二个构造函数。
您可以将第二行更改为:
laptopObj2 = Laptop("Dell","i5", 4, 500);
或者更好的定义是:
Laptop laptopObj1;
....
Laptop laptopObj2("Dell","i5", 4, 500);
另一个问题是Laptop()
构造函数定义中的问题:
Laptop::Laptop(char Bra[],char Pro[],int Ram,int HDrive)
{
.....
setBrand(Bra []); // Remove the []
setProcessor(Pro []); // Remove the []
....
}
还有一个问题:类的某些函数没有定义:
void setBrand(char Bra[]);
void setProcessor(char Pro[]);
void setRam(int Ram);
void setHardDrive(int HDrive);
void display();
编辑:
<> > C++的一个对象是<>代码> STD::String (<代码>包含< /COD> >)。可以使用它代替char STR[] /Cuth>——只是在C++中声明字符串的简单方法。例如,在你的例子中:
/* Replace this: */
char brand[10];
char processor[10];
void setBrand(char Bra[]);
void setProcessor(char Pro[]);
char *getBrand();
char *getProcessor();
/* With this: */
string brand;
string processor;
void setBrand(const string &Bra);
void setProcessor(const string &Pro);
string getBrand();
string getProcessor();
您确实应该使用std::string而不是char[]
在构造函数的问题上,不需要调用SETTER,如下代码所示。C++有一种能力的捷径。我使用了STD::String和固定所有TypOS。
#include <iostream>
#include <string>
using namespace std;
class Laptop
{
private:
string brand;
string processor;
int ram;
int hardDrive;
public:
void setBrand(string Bra);
void setProcessor(string Pro);
void setRam(int Ram);
void setHardDrive(int HDrive);
string getBrand();
string getProcessor();
int getRam();
int getHardDrive();
Laptop();
Laptop(string, string, int, int);
};
Laptop::Laptop()
: brand("None")
, processor("None")
, ram(0)
, hardDrive(0)
{
cout << "Default constructor called...\n";
}
Laptop::Laptop(string Bra, string Pro, int Ram, int HDrive)
: brand(Bra)
, processor(Pro)
, ram(Ram)
, hardDrive(HDrive)
{
cout << "Parameterized constructor called...\n";
}
string Laptop::getBrand()
{
return brand;
}
string Laptop::getProcessor()
{
return processor;
}
int Laptop::getRam()
{
return ram;
}
int Laptop::getHardDrive()
{
return hardDrive;
}
int main()
{
Laptop laptopObj1;
Laptop laptopObj2("Dell", "i5", 4, 500);
cout << "Brand :" << laptopObj1.getBrand() << "\n";
cout << "Processor :" << laptopObj1.getProcessor() << "\n";
cout << "Ram :" << laptopObj1.getRam() << "\n";
cout << "HardDrive :" << laptopObj1.getHardDrive() << "\n";
cout << "Brand :" << laptopObj2.getBrand() << "\n";
cout << "Processor :" << laptopObj2.getProcessor() << "\n";
cout << "Ram :" << laptopObj2.getRam() << "\n";
cout << "HardDrive :" << laptopObj2.getHardDrive() << "\n";
}
#包括
#包括
使用名称空间std;
班级笔记本电脑
{
私人:
串品牌;
字符串处理器;
内存;
int硬盘;
公众:
void-setBrand(弦乐文胸);
void setProcessor(stringpro);
无效设置Ram(内部Ram);
无效设置硬盘驱动器(内部硬盘驱动器);
字符串getBrand();
字符串getProcessor();
int getRam();
int getHardDrive();
笔记本电脑();
笔记本电脑(字符串,字符串,int,int);
};
笔记本电脑::笔记本电脑()
:品牌(“无”)
,处理器(“无”)
,ram(0)
,硬盘(0)
{
不可能用std:string替换所有字符数组,只想指出在默认构造函数Laptop::Laptop()中您正在声明新变量,然后它们不在您使用的范围内。您试图将const
字符传递给需要可变字符的构造函数。虽然您的错误消息与建议的重复消息不同,但问题和解决方案是相同的。我认为您应该使用类似@skeller s的std::string但是在使用像这样的容器之前,您还应该更好地理解指针和C字符串是如何工作的。附录:char brand[10]=“:None\n”
在笔记本电脑中构造函数没有做任何有用的事情。char brand[10]
声明一个新的品牌
变量,该变量不同于私有数据成员字符品牌[10];
。构造函数中的此品牌
仅存在于构造函数中。它被设置为包含“:无\n”
。成员品牌
未初始化。@user4581301你说得对。我在创建这篇文章时忘记了这件事。@KorelK先生,我也必须写setter函数的定义吗?我想如果我在构造函数中使用setter函数,比如void Laptop::setBrand(char a[]),我就不需要它们了{brand=a;}@gintoki若要在构造函数内部(或外部)使用setter函数,您必须告诉编译器该函数的作用。如果您没有为被调用函数编写定义,编译器会抛出该函数的定义缺失错误。“无需调用setter”-这取决于setter的定义。如果您有一些条件,您可能希望通过setter传递输入。。。
#include <iostream>
#include <string>
using namespace std;
class Laptop
{
private:
string brand;
string processor;
int ram;
int hardDrive;
public:
void setBrand(string Bra);
void setProcessor(string Pro);
void setRam(int Ram);
void setHardDrive(int HDrive);
string getBrand();
string getProcessor();
int getRam();
int getHardDrive();
Laptop();
Laptop(string, string, int, int);
};
Laptop::Laptop()
: brand("None")
, processor("None")
, ram(0)
, hardDrive(0)
{
cout << "Default constructor called...\n";
}
Laptop::Laptop(string Bra, string Pro, int Ram, int HDrive)
: brand(Bra)
, processor(Pro)
, ram(Ram)
, hardDrive(HDrive)
{
cout << "Parameterized constructor called...\n";
}
string Laptop::getBrand()
{
return brand;
}
string Laptop::getProcessor()
{
return processor;
}
int Laptop::getRam()
{
return ram;
}
int Laptop::getHardDrive()
{
return hardDrive;
}
int main()
{
Laptop laptopObj1;
Laptop laptopObj2("Dell", "i5", 4, 500);
cout << "Brand :" << laptopObj1.getBrand() << "\n";
cout << "Processor :" << laptopObj1.getProcessor() << "\n";
cout << "Ram :" << laptopObj1.getRam() << "\n";
cout << "HardDrive :" << laptopObj1.getHardDrive() << "\n";
cout << "Brand :" << laptopObj2.getBrand() << "\n";
cout << "Processor :" << laptopObj2.getProcessor() << "\n";
cout << "Ram :" << laptopObj2.getRam() << "\n";
cout << "HardDrive :" << laptopObj2.getHardDrive() << "\n";
}