在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) 给定如下函数:
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在修订版中已经获得了一些优化.
printf函数有一些函数,你可以使用%g,3如果float是3.00将显示整数,并显示3.01它是否实际上是一个浮点数,你有什么方法可以通过一些代码吗?
我遇到了用代码块编写的项目的问题.
我已经制作了新的控制台应用程序.但是当我添加一个新的类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) 我有一个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++ 标准(至少早于 C++17)已经说明了初始化顺序。
在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按照其定义在翻译单元中出现的顺序进行初始化。
C++17 引入了内联变量,我相信这意味着可以在多个翻译单元中定义具有静态存储持续时间和命名空间范围以及动态初始化的单个变量。
C++ 是否对这些变量的初始化顺序做出任何保证?
win32 API有两个方法StrFormatByteSize和StrFormatByteSizeEx.即使两个方法在语义上做同样的事情,并且Ex计数器部分只提供一个新参数来稍微改变行为,那么它们不能有两个相同函数的重载?
它是c/c ++的限制还是这种尴尬约定的可能原因是什么?
当我研究模板专业化时,我使用一个非常简单的例子,但我仍然有错误.
#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中,有时我的输出将不会打印到终端,直到我打印换行符\n.例如:
int main()
{
printf("Hello, World");
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Hello World将不会打印到下一个printf (我知道这是通过在gdb中设置断点).有人可以解释为什么会发生这种情况以及如何解决这个问题?
谢谢!