setters函数在构造函数c++中
setters function inside constructor c++
我试图在构造函数中使用setter函数,这是我以前从未做过的。它给了我以下错误:
[Error] no match for call to '(Laptop) (const char [5], const char [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;
}
我认为错误在构造函数中
Laptop::Laptop(char Bra[],char Pro[],int Ram,int HDrive)
{
cout<<"Parameterized constructor called...n";
setBrand(Bra );
setProcessor(Pro );
setRam(Ram);
setHardDrive(HDrive);
}
char *Laptop::getBrand()
{
return brand;
}
char *Laptop::getProcessor()
{
return processor;
}
int Laptop::getRam()
{
return ram;
}
int Laptop::getHardDrive()
{
return hardDrive;
}
int main()
{
Laptop laptopObj1;
Laptop laptopobj1("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";
}
这里有很多错误。。
Laptop laptopObj1,laptopObj2;
...
laptopObj2("Dell","i5", 4, 500);
构造函数不能使用两次。您在第一行中为两个对象都使用了构造函数Laptop()
,然后尝试为laptopObj2
使用第二个构造函数。您可以将第二行更改为:
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
(#include <string>
(。您可以使用它来代替char str[]
——这是在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();
您正在传递两个const char*
作为参数,所以您应该更改它:
Laptop::Laptop(char Bra[],char Pro[],int Ram,int HDrive)
到此:
Laptop::Laptop(const char* ,const char* ,int Ram,int HDrive)
您确实应该使用std::string而不是char[]。
关于构造函数的问题,没有必要调用setter,如下代码所示。C++有一个实现该功能的快捷方式。我使用了std::string并修复了所有的拼写错误。
#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";
}
Mike
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为