如何将对象分配给继承的函数
How to assign an object to an inhereted function
如何将继承的方法分配给对象?
,你能给我解释一下我的代码有什么问题吗?
我是新手,想知道有没有更好的方法
int main(){
CalculateData data;
data = data.ReadData(data);//does not let me assign data to the method??
}
其余代码
#include<string>#include<fstream>#include<iostream>#include<vector>using namespace std;
class File//base class
{
private:
double Size;
public:
vector <double>values;
double GetSize();
void SetSize(double size);
File ReadData(File data);
};
class CalculateData :public File {//inherent from file class
public:
std::vector <double> value;
}
File File::ReadData(File file) {//method of File class
{std::fstream File("Data.txt", std::ios_base::in);
double a;
int counter = 0;
while (File >> a)
{
//printf("%f ", a);
file.values.push_back(a);
counter++;
}
file.SetSize(counter);
cout << "size is " << file.GetSize() << endl;
File.close();
}
return file;
}
坦率地说,这很难提供帮助,因为错误只是方法有缺陷的结果。我将使用一个比你的例子更简单的例子,它有大部分相同的问题:
#include <iostream>
struct Base {
int value;
Base read(Base b) {
b.value = 42;
return b;
};
};
struct Derived : Base{
int values;
};
int main() {
Derived d;
d = d.read(d);
}
直接的问题是编译器错误:
<source>: In function 'int main()':
<source>:17:17: error: no match for 'operator=' (operand types are 'Derived' and 'Base')
17 | d = d.read(d);
| ^
<source>:11:8: note: candidate: 'constexpr Derived& Derived::operator=(const Derived&)'
11 | struct Derived : Base{
| ^~~~~~~
<source>:11:8: note: no known conversion for argument 1 from 'Base' to 'const Derived&'
<source>:11:8: note: candidate: 'constexpr Derived& Derived::operator=(Derived&&)'
<source>:11:8: note: no known conversion for argument 1 from 'Base' to 'Derived&&'
d
是 Derived
和 read
returns 是 Base
。它们是不同的类型,除非您提供它们之间的某种转换,否则不能将它们相互分配。
但是,read
将 Base
作为参数(按值)和 returns 只是为了让调用者将其分配给他们调用的对象是没有意义的上的方法。如果该方法旨在修改当前对象,那么它应该直接这样做:
void read() {
value = 42;
}
绝对没有必要传递一个 Base
作为参数,它无论如何都会被复制,因为你按值传递它。
代码中的下一个可疑之处是 Derived
有另一个成员,其名称与 Base
相似,但未使用。 Derived
已经从 Base
继承了 value
成员。它不需要另一个 values
成员。
最后但同样重要的是,成员的初始化应该在构造函数的初始化列表中进行(如果不是 in-class 使用初始化器)。如果初始化很复杂,可以使用 static
方法。因此:
struct Base {
int value;
Base() : value( read_input() ) {}
static int read_input() {
return 42;
}
};
struct Derived : Base {};
int main() {
Derived d;
}
这段代码和上面的一样。由于不清楚Derived
的用途是什么,可以去掉。
如何将继承的方法分配给对象? ,你能给我解释一下我的代码有什么问题吗? 我是新手,想知道有没有更好的方法
int main(){
CalculateData data;
data = data.ReadData(data);//does not let me assign data to the method??
}
其余代码
#include<string>#include<fstream>#include<iostream>#include<vector>using namespace std;
class File//base class
{
private:
double Size;
public:
vector <double>values;
double GetSize();
void SetSize(double size);
File ReadData(File data);
};
class CalculateData :public File {//inherent from file class
public:
std::vector <double> value;
}
File File::ReadData(File file) {//method of File class
{std::fstream File("Data.txt", std::ios_base::in);
double a;
int counter = 0;
while (File >> a)
{
//printf("%f ", a);
file.values.push_back(a);
counter++;
}
file.SetSize(counter);
cout << "size is " << file.GetSize() << endl;
File.close();
}
return file;
}
坦率地说,这很难提供帮助,因为错误只是方法有缺陷的结果。我将使用一个比你的例子更简单的例子,它有大部分相同的问题:
#include <iostream>
struct Base {
int value;
Base read(Base b) {
b.value = 42;
return b;
};
};
struct Derived : Base{
int values;
};
int main() {
Derived d;
d = d.read(d);
}
直接的问题是编译器错误:
<source>: In function 'int main()':
<source>:17:17: error: no match for 'operator=' (operand types are 'Derived' and 'Base')
17 | d = d.read(d);
| ^
<source>:11:8: note: candidate: 'constexpr Derived& Derived::operator=(const Derived&)'
11 | struct Derived : Base{
| ^~~~~~~
<source>:11:8: note: no known conversion for argument 1 from 'Base' to 'const Derived&'
<source>:11:8: note: candidate: 'constexpr Derived& Derived::operator=(Derived&&)'
<source>:11:8: note: no known conversion for argument 1 from 'Base' to 'Derived&&'
d
是 Derived
和 read
returns 是 Base
。它们是不同的类型,除非您提供它们之间的某种转换,否则不能将它们相互分配。
但是,read
将 Base
作为参数(按值)和 returns 只是为了让调用者将其分配给他们调用的对象是没有意义的上的方法。如果该方法旨在修改当前对象,那么它应该直接这样做:
void read() {
value = 42;
}
绝对没有必要传递一个 Base
作为参数,它无论如何都会被复制,因为你按值传递它。
代码中的下一个可疑之处是 Derived
有另一个成员,其名称与 Base
相似,但未使用。 Derived
已经从 Base
继承了 value
成员。它不需要另一个 values
成员。
最后但同样重要的是,成员的初始化应该在构造函数的初始化列表中进行(如果不是 in-class 使用初始化器)。如果初始化很复杂,可以使用 static
方法。因此:
struct Base {
int value;
Base() : value( read_input() ) {}
static int read_input() {
return 42;
}
};
struct Derived : Base {};
int main() {
Derived d;
}
这段代码和上面的一样。由于不清楚Derived
的用途是什么,可以去掉。