小编SSi*_*ht3的帖子

C++类设计问题

我有一个类Node.此类可以相对于自身添加或删除其他节点.Node由Class类使用.为了防止在使用过程中直接修改节点(外部,IE不是由适当的类),并导致List类出现问题,节点添加/删除功能要么是受保护的,要么是私有的.这要求List类是Node的朋友.

但是,这个问题是List类本身是其他子类的模板类,添加原型/为每个子类添加friend关键字显然不是最佳解决方案.

我如何设计Node和List类/子类,以便:

  • Node不能在外部自己构造,只用特定的类/子类构造?
  • 节点可以构造/删除上面给出的其他节点吗?
  • 节点函数只能访问特定的类(列表,列表子类和列表助手类 - 列表助手类不是列表的子类)?
  • 节点变量(Item)可以在上面公开访问吗?
  • List,list子类和list helper类可以直接修改或间接修改Node的非公共变量吗?

这些是可能的,如果是的话,怎么样?

c++ subclass

2
推荐指数
1
解决办法
1670
查看次数

C fputc错误处理?

fputc的大多数C文件编写示例使用一个非常基本的示例,几乎没有错误检查过程.

我应该使用哪些错误检查技术和函数与fputc循环一起确保fputc已成功写入文件?我应该如何使用它们?

我特别要求fputc的原因是我正在使用双向链表.

c error-handling file

2
推荐指数
1
解决办法
1209
查看次数

time_t转换格式问题

我正在尝试创建一个易于访问的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,则可以获得奖励.

c++ time

2
推荐指数
1
解决办法
3744
查看次数

我如何隐式专门化转换?

使用以下代码,如果我尝试将模板数组转换为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结尾的数组(它不太可能).

c++ templates class

2
推荐指数
1
解决办法
94
查看次数

C++模糊重载问题

我有一个名为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不改变参数的数量或它们出现的顺序)并且不改变标准库,无论如何都要防止有问题的函数中的隐式转换?

我忘了添加,最好没有类型转换,因为这对函数调用来说很乏味而且不是用户友好的.

c++ overloading

1
推荐指数
1
解决办法
614
查看次数

类赋值运算符=问题

假设我有两个类,在两个不同的标题中,称为:

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而导致的明显错误的同时执行上述操作?

c++ assignment-operator

1
推荐指数
1
解决办法
1522
查看次数

C++运算符技术

程序员在堆栈溢出时提到过,如果你声明一个类函数,例如:

operator++()
Run Code Online (Sandbox Code Playgroud)

对于用户界面目的(因为用户自然认为其相反应该起作用),您应该声明另一个:

operator--()
Run Code Online (Sandbox Code Playgroud)

是否有指向支持此文章的文章的链接?我希望能够将它引用给其他程序员.

我想补充一点,也许这个建议类似于32规则.

根据hostilefork的回答,也许相反的函数应该声明,即使它不服务于某个目的,但作为私有,所以用户明确知道他们不能调用该函数?还是那只是迂腐?

c++ methods

0
推荐指数
1
解决办法
166
查看次数

使用关键字问题的C++子类

说我有以下内容:

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)

c++ subclass

-2
推荐指数
1
解决办法
452
查看次数

隐含的向上翻译问题

我发现在编写接受主类或子类参数的函数(使用函数重载)时,通常会发生隐式向上转换(子类被升级为主类,而主类函数被调用).我不希望发生这种隐式的向上转换,因为它意味着潜在的细微错误并在以后引起问题.

我在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与非虚方法调用混淆.

c++

-2
推荐指数
1
解决办法
2936
查看次数