以下工作代码显示两个给定数字中较小的一个。
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class T>
class Bucky {
public:
Bucky(T a, T b) {
first = a;
second = b;
}
T smaller() {
return (first<second?first:second);
}
private:
T first, second;
};
int main() {
Bucky <int>obj(69, 105);
cout << obj.smaller() << endl;
return 0;
}
我想来自班级&#39; 和创建子类,其中成员函数显示& #34;你好!&#34;
请帮忙。
P.S。这是我创建子类的最佳失败尝试:
template <class T>
class mySubclass : public Bucky<T>
{
public:
mySubclass(T a, T b) { // error C2512: 'Bucky<T>' : no appropriate default constructor available
//first = a;
//second = b;
}
void greet() {
cout << "Hi there!";
}
};
答案 0 :(得分:4)
构造派生类时,它也将构造其基类。如果没有明确指定它,它将尝试使用其默认构造函数(不带参数)构造基类。但是,您的基类没有默认构造函数。相反,您希望委托给Bucky
的构造函数,该构造函数需要两个T
个参数:
mySubclass(T a, T b)
: Bucky<T>(a, b) { }
正如您所看到的,这使用了以:
开头的奇怪语法,并将构造函数体留空。此语法是成员初始化列表。它说我们通过将Bucky<T>
和a
传递给它的构造函数来初始化b
基类。实际上,您还应该将此用于Bucky
构造函数:
Bucky(T a, T b)
: first(a), second(b) { }
我们分别使用first
和second
初始化a
和b
成员。
答案 1 :(得分:3)
mySubclass
构造函数未显式初始化基类对象Bucky
。因此,编译器将通过调用Bucky
的默认构造函数来尝试隐式执行此操作。正如错误所述,Bucky
没有默认构造函数。要修复错误,请在构造函数的成员初始化列表中显式初始化Bucky
。
mySubclass(T a, T b)
: Bucky<T>(a, b)
{}
您还应该使用成员初始值设定项列表来初始化Bucky
的数据成员
Bucky(T a, T b)
: first(a)
, second(b)
{}
答案 2 :(得分:1)
您可以从派生的构造函数中调用基础构造函数:
mySubClass(T a, T b)
: Bucky(a, b)
{
}
正如错误所述,通过实现构造函数(接受参数的构造函数),您已删除了默认构造函数。当您为子类创建构造函数时,它必须初始化其基类。这样做的方法是在初始化列表中调用基础构造函数,就像上面提到的注释中的人一样。
答案 3 :(得分:1)
正如编译器指出的那样,它无法为您的基类找到合适的默认构造函数。因此,您需要在member initializer list中明确地调用一个。
template <class T>
class mySubclass : public Bucky<T>
{
public:
mySubclass(T a, T b) : Bucky<T>(a, b) { }
void greet() {
cout << "Hi there!";
}
};
答案 4 :(得分:0)
template <class T>
class a:public Bucky<T> {
public:
a(T r, T l): Bucky<T>(r, l) {}
void Hello(void) { std::cout << "Hello there!" << std::endl; }
};
int main() {
Bucky <int>obj(69, 105);
a<int> obj2(69, 105);
obj2.Hello();
cout << obj.smaller() << endl;
return 0;
}
我认为这就是你正在寻找的东西。