小编Dre*_*ann的帖子

C++中适当的工厂模式

在C#中,您必须在类中声明所有内容,因此示例工厂模式可能如下所示:

namespace MySpace {

public class CFactory
{
  public static CFactory Current()
  {
    static CFactory singleton;
    return singleton;
  }
  public CBase Create() { return null; }
}

}
Run Code Online (Sandbox Code Playgroud)

在C++中,你没有这个限制.所以将"工厂"方法作为全局函数而不是让它们成为一个类被认为是"不好的做法"?

例1:

namespace MySpace {

// factory method
std::shared_ptr<CBase> CreateBase() { return NULL; }

}
Run Code Online (Sandbox Code Playgroud)

例2:

namespace MySpace {

// factory class
class CFactory
{
public:
  std::shared_ptr<CBase> CreateBase() { return NULL; }
};

// factory method exposing class
CFactory& GetFactory()
{
  static CFactory singleton;
  return singleton;
}

}
Run Code Online (Sandbox Code Playgroud)

例3:

namespace MySpace { …
Run Code Online (Sandbox Code Playgroud)

c++ oop std factory-pattern

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

虚拟功能

我真的不明白 - 我什么时候应该使用虚拟功能?如果有人能向我解释,我会很高兴,谢谢.

c#

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

执行身份提升有什么开销:: lexical_cast?

给定如下函数:

template< typename T >
void function1( const T &t )
{
  function2( boost::lexical_cast<std::string>(t) );
}
Run Code Online (Sandbox Code Playgroud)

如果传递给的类型function1已经是一个什么样的开销std::string

开销是否会有所不同,具体取决于我要使用的类型lexical_cast

使重载函数绕过转换是多余的吗?例如:

void function1( const std::string &t )
{
  function2( t );
}

template< typename T >
void function1( const T &t )
{
  function1( boost::lexical_cast<std::string>(t) );
}
Run Code Online (Sandbox Code Playgroud)

boost的版本可能与你的答案有关,因为据我所知,lexical_cast在修订版中已经获得了一些优化.

c++ boost lexical-cast

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

如何检查浮点数是否为整数?

printf函数有一些函数,你可以使用%g,3如果float是3.00将显示整数,并显示3.01它是否实际上是一个浮点数,你有什么方法可以通过一些代码吗?

c++ integer numbers comma

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

在向项目添加类之后对"main"的未定义引用

我遇到了用代码块编写的项目的问题.

我已经制作了新的控制台应用程序.但是当我添加一个新的类C :: B时,我会抛出一个错误:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o||In function `_start':
(.text+0x20)||undefined reference to `main'
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题.

main.cpp中

#include <iostream>
#include "display.h"

int main()
{
    Display newDisplay;
    std::cout << "Hello world!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

display.cpp

#include "display.h"
#include <iostream>

Display::Display()
{
    std::cout << "Constructor" << std::endl;
}

Display::~Display()
{
    std::cout << "Destructor" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

display.h

#ifndef DISPLAY_H
#define DISPLAY_H


class Display
{
    public:
        Display();
        virtual ~Display();

    protected:
    private:
};

#endif // DISPLAY_H
Run Code Online (Sandbox Code Playgroud)

c++ linux gcc program-entry-point reference

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

向量值boost :: program_options的默认值

我有一个boost :: program_options选项,可以将所需的输入选项成功解析为向量,但是我没有看到如何为它提供默认值。例:

base.add_options()
 ("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
Run Code Online (Sandbox Code Playgroud)

可以很好地将值读入vecoptions之类的东西

    base.add_options()
 ("int_value",po::value<int>(&intoption)->default_value(1),"description");
Run Code Online (Sandbox Code Playgroud)

也可以正常工作,但是尝试为vector参数赋予默认值,例如in

base.add_options()
 ("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
Run Code Online (Sandbox Code Playgroud)

给出编译器错误

错误:静态断言失败:源类型既不是std :: ostream`able也不是std :: wostream`able

如何创建具有默认值(如{0,1,2})的向量值float选项?

c++ boost-program-options

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

静态存储中的内联变量何时初始化?

C++ 标准(至少早于 C++17)已经说明了初始化顺序。

在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按照其定义在翻译单元中出现的顺序进行初始化。

C++17 引入了内联变量,我相信这意味着可以在多个翻译单元中定义具有静态存储持续时间命名空间范围以及动态初始化的单个变量。

C++ 是否对这些变量的初始化顺序做出任何保证?

c++ initialization-order c++17 inline-variable

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

为什么win32 API函数没有重载,而是使用Ex作为后缀?

win32 API有两个方法StrFormatByteSize和StrFormatByteSizeEx.即使两个方法在语义上做同样的事情,并且Ex计数器部分只提供一个新参数来稍微改变行为,那么它们不能有两个相同函数的重载?

它是c/c ++的限制还是这种尴尬约定的可能原因是什么?

c c++ architecture winapi

4
推荐指数
2
解决办法
1980
查看次数

模板特化:与任何模板声明都不匹配

当我研究模板专业化时,我使用一个非常简单的例子,但我仍然有错误.

#include <iostream>

template <class T>
class chrrr{
    public:
    T chgchr(T c);  
};

template < class T> 
T chrrr<T>::chgchr(T c){
    return c+1; 
}

template <>
class chrrr<char>{
    public:
    char chgchr(char c);    
};
template <>
char chrrr<char>::chgchr(char c){
    return c+2; 
}



using namespace std;

int main(){
    char a='a';
    int i=1;

    chrrr<int> it;
    chrrr<char> ch;
    cout<<ch.chgchr(a)<<endl;
    cout<<it.chgchr(i)<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误说:

line 20: error: template-id ‘chgchr<>’ for ‘char chrrr<char>::chgchr(char)’ does not match any template declaration
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它不匹配?如果我在类定义体中而不是在外侧定义chgchr,它的效果非常好.

c++ templates

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

为什么C直到换行才打印到shell?

在C中,有时我的输出将不会打印到终端,直到我打印换行符\n.例如:

int main()
{
   printf("Hello, World");
   printf("\n");
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Hello World将不会打印到下一个printf (我知道这是通过在gdb中设置断点).有人可以解释为什么会发生这种情况以及如何解决这个问题?

谢谢!

c linux macos shell

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