我有一个类Node.此类可以相对于自身添加或删除其他节点.Node由Class类使用.为了防止在使用过程中直接修改节点(外部,IE不是由适当的类),并导致List类出现问题,节点添加/删除功能要么是受保护的,要么是私有的.这要求List类是Node的朋友.
但是,这个问题是List类本身是其他子类的模板类,添加原型/为每个子类添加friend关键字显然不是最佳解决方案.
我如何设计Node和List类/子类,以便:
这些是可能的,如果是的话,怎么样?
fputc的大多数C文件编写示例使用一个非常基本的示例,几乎没有错误检查过程.
我应该使用哪些错误检查技术和函数与fputc循环一起确保fputc已成功写入文件?我应该如何使用它们?
我特别要求fputc的原因是我正在使用双向链表.
我正在尝试创建一个易于访问的TimeDate变量,但我遇到了转换问题.在time.h中,如何将time_t(自1970年1月1日以来的秒数)转换为当前本地时区(如果适用则补偿夏令时),以便:
time_t Seconds;
Run Code Online (Sandbox Code Playgroud)
变为:
struct TimeDate
{
short YYYY;
unsigned char MM;
unsigned char DD;
unsigned char HH; //Non-DST, non-timezone, IE UTC (user has to add DST and TZO to get what they need)
unsigned char MM;
unsigned char S;
char TZ[4]; //This can be optionally a larger array, null terminated preferably
char TZO; //Timezone Offset from UTC
char DST; //Positive is DST (and amount of DST to apply), 0 is none, negative is unknown/error
};
Run Code Online (Sandbox Code Playgroud)
在此过程中不使用任何字符串文字(时区名称栏)(以保持其效率)?这也考虑到了闰年.如果TimeDate可以转换回time_t,则可以获得奖励.
使用以下代码,如果我尝试将模板数组转换为std :: string,而不是使用预期的std :: string转换方法编译器,则会引发歧义解决问题(因为它尝试调用数组转换方法) :
#include <iostream>
template<typename TemplateItem>
class TestA
{
public:
TemplateItem Array[10];
operator const TemplateItem *() const {return Array;}
operator const std::string() const;
};
template<>
TestA<char>::operator const std::string() const
{
std::string Temp("");
return Temp;
}
int main()
{
TestA<char> Test2;
std::string Temp("Empty");
Temp = Test2; //Ambiguity error. std::string or TemplateItem * ?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我需要对代码进行哪些修改才能使代码正确且隐式地解析为std :: string转换函数?特别是给定const TemplateItem*将被视为以null结尾的数组(它不太可能).
我有一个名为FileProc的类,它运行文件IO操作.在一个实例中,我声明了两个函数(它们是operator = functions的子函数),两者都是决定性的不同:
const bool WriteAmount(const std::string &Arr, const long S)
{
/* Do some string conversion */
return true;
}
const bool WriteAmount(const char Arr[], unsigned int S)
{
/* Do some string conversion */
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用'char string'调用WriteAmount,它会报告一个歧义错误 - 说它在char字符串的WriteAmount和std :: string的WriteAmount之间混淆.我知道引擎盖下发生了什么 - 它试图使用std :: string构造函数隐式地将char字符串转换为std :: string.但我不希望在WriteAmount的实例中发生这种情况(IE我不希望在函数内发生任何隐式转换 - 假设每个角色都针对每个角色进行了优化).
我的问题是,为了保持一致性,不改变函数格式(IE不改变参数的数量或它们出现的顺序)并且不改变标准库,无论如何都要防止有问题的函数中的隐式转换?
我忘了添加,最好没有类型转换,因为这对函数调用来说很乏味而且不是用户友好的.
假设我有两个类,在两个不同的标题中,称为:
class TestA
{
public:
int A;
};
class TestB
{
public:
int B;
};
Run Code Online (Sandbox Code Playgroud)
而且我想给彼此一个赋值运算符,所以它就像:
class TestB; //Prototype of B is insufficient to avoid error with A's assignment
class TestA
{
public:
int A;
const TestA &operator=(const TestB& Copy){A = Copy.B; return *this;}
};
class TestB
{
public:
int B;
const TestB &operator=(const TestA& Copy){B = Copy.A; return *this;}
};
Run Code Online (Sandbox Code Playgroud)
如何在避免因尚未定义的调用/使用类TestB而导致的明显错误的同时执行上述操作?
程序员在堆栈溢出时提到过,如果你声明一个类函数,例如:
operator++()
Run Code Online (Sandbox Code Playgroud)
对于用户界面目的(因为用户自然认为其相反应该起作用),您应该声明另一个:
operator--()
Run Code Online (Sandbox Code Playgroud)
是否有指向支持此文章的文章的链接?我希望能够将它引用给其他程序员.
根据hostilefork的回答,也许相反的函数应该声明,即使它不服务于某个目的,但作为私有,所以用户明确知道他们不能调用该函数?还是那只是迂腐?
说我有以下内容:
template<typename TemplateItem>
class TestA
{
public:
TemplateItem Item;
void Function1(){;}
void Function2(){;}
void Function3(){;}
void Function4(){;}
//Etc etc number of functions is quite lengthy
};
template<typename TemplateItem>
class TestB : public TestA<TemplateItem>
{
public:
//How would I use the 'using' keyword to include everything from TestA
//Without manually declaring it for 20 or more functions/variables individually
};
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉模板类继承问题的人:
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19
有些人似乎仍然认为没有这样的遗传问题,尽管上面的链接说明相反,但引用上面给出的网站:
template<typename T>
class B {
public:
void f() { } ? member of class B<T>
};
template<typename T>
class …Run Code Online (Sandbox Code Playgroud) 我发现在编写接受主类或子类参数的函数(使用函数重载)时,通常会发生隐式向上转换(子类被升级为主类,而主类函数被调用).我不希望发生这种隐式的向上转换,因为它意味着潜在的细微错误并在以后引起问题.
我在google上搜索了有关这方面的信息,但是我可以使用的连贯信息很少,只是间接引用它.
如何禁用,停止或阻止隐式向上转换(甚至是向下转换)?
(我不能提供任何示例代码,因为这是一个不时发生的一般问题).
不,这与方法(我会指定方法)无关,而是与函数有关.
没有示例代码,但伪想法:void Function(BaseClass&A); void Function(SubclassClass&B);
Function(ASubclass); //Implicit upcasting occurs, calls BaseClass instead
Run Code Online (Sandbox Code Playgroud)
上述情况不会按常规发生(比如SubclassClass函数被淘汰/删除),但Subclass将被上传到BaseClass以与BaseClass函数一起使用,而不是报告错误或生成警告 - 或者会有所帮助,因为我不希望发生隐式的向上转换.
请不要将upcasting与非虚方法调用混淆.