在C++中,我知道有两种方法可以重载.我们可以在内部(如类a)或外部(如类b)重载它.但是,问题是,这两者在编译时或运行时是否存在差异?
class a
{
public:
int x;
a operator+(a p) // operator is overloaded inside class
{
a temp;
temp.x = x;
temp.x = p.x;
return temp;
}
};
class b
{
public:
friend b operator+(b, b);
int x;
};
b operator+(b p1, b p2) // operator is overloaded outside class
{
p1.x += p2.x;
return p1;
}
Run Code Online (Sandbox Code Playgroud) 这段代码并不是JS开发人员所不知道的
function get_counter()
{
return (
function() {
var c = 0;
return function() { return ++c; };
})();
}
Run Code Online (Sandbox Code Playgroud)
它基本上创建了一个创建不同的枚举器.所以我想知道在使用新的lambda语义的C++ 11中是否可以做同样的事情?我最终写了这篇C++,遗憾的是它不能编译!
int main()
{
int c;
auto a = [](){
int c = 0;
return [&](){
cout << c++;
};
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有一个解决方法来编译它,如果有编译器如何使这个代码正确运行?我的意思是它必须创建单独的枚举器,但它也应该收集垃圾(未使用的c变量).
顺便说一句,我正在使用VS2012编译器,它会生成此错误:
Error 2 error C2440: 'return' : cannot convert from 'main::<lambda_10d109c73135f5c106ecbfa8ff6f4b6b>::()::<lambda_019decbc8d6cd29488ffec96883efe2a>' to 'void (__cdecl *)(void)' c:\users\ali\documents\visual studio 2012\projects\test\test\main.cpp 25 1 Test
Run Code Online (Sandbox Code Playgroud) 抛开所有可维护性和读取问题,这些代码行是否会产生不确定的行为?
float a = 0, b = 0;
float& x = some_condition()? a : b;
x = 5;
cout << a << ", " << b;
Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经在visual studio中编写了所有代码,现在我需要添加一些UI,因此我将使用Qt.所以我在我的项目中添加了每个文件(主类除外),然后尝试使用Qt编译它.因为我使用了一些c ++ 0x功能,所以我必须将这一行添加到项目文件中:
QMAKE_CXXFLAGS += -std=c++0x
Run Code Online (Sandbox Code Playgroud)
然后我尝试编译它.只有两个错误(可能会有更多但是这两个编译器停止)
In file included from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/postypes.h:42,
from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:42,
from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,
from d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:40,
from ../TranslatorBase/ttObject.h:5,
from ../TranslatorBase/ttArray.h:5,
from ../TranslatorBase/ttArray.cpp:1:
d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf' has not been declared
d:\qt\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprintf' has not been declared
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会出现这样的错误.并确保我首先尝试使用此命令使用cygwin/gcc编译同一项目:
gcc -std=c++0x TranslatorBase/ttArray.cpp -c -o ttArray.o
Run Code Online (Sandbox Code Playgroud)
即使没有任何警告,它也没有错误编译.事实上,我项目中的每个文件都在没有任何警告的情况下进行编译.
我现在正在使用基于Qt v4.7.0的Qt Creator v2.0.1并使用mingw/gcc v4.4.0
- 编辑 -
只是我发现的一件新事物,即使没有我的源文件(只有Qt生成的文件),仍然存在编译错误.我觉得gcc有问题.
@Troubadour Qt生成了这个命令:
g++ -c -std=c++0x -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I'd:/Qt/qt/include/QtCore' -I'd:/Qt/qt/include/QtGui' -I'd:/Qt/qt/include' -I'd:/Qt/qt/include/ActiveQt' -I'debug' -I'.' -I'../TranslatorUI' …Run Code Online (Sandbox Code Playgroud) 一段时间以来一直困扰着我,但我没有找到关于此事的任何好资源.我的代码中有一些全局变量.很明显,它们是按照某种顺序初始化的,但是在进行任何初始化之前保留所有这些对象所需的内存是什么?
这是我的代码中可能出错的简单示例以及如何使用答案:
我有一个map<RTTI, object*> objectPool在我的代码中保存每个类的样本,我用它来加载文件中的对象.为了创建这些示例,我使用一些全局变量来将类实例引入objectPool.但有时这些示例实例是在ObjectPool本身之前初始化的.这会产生运行时错误.
为了解决这个错误我使用了一些延迟初始化程序map<RTTI,object*>* lateInitializedObjectPool;.现在每个实例首先检查objectPool是否已初始化,如果没有则初始化它,然后将其自身引入对象池.它似乎工作正常,但我担心,即使对象池指针所需的内存在其他类开始自我介绍之前没有保留,这可能会导致访问冲突.
我不确定它是否可能,但对我来说似乎有点合理,我正在寻找一种允许我进行这些操作的数据结构:
当然,编辑不会导致元素顺序的任何变化.什么使它成为可能的是我将按递增的顺序逐个插入元素.因此,如果我第五次尝试插入,我确定在这之前的所有四个元素都比它小,并且在此之后的所有元素将会更大.
我已经设法创建了一些preperty类,其中包含了我们期望的所有内容.我的意思是在使用它时你不需要调用函数只是使用operator =will会做所有的工作.但是只有一件事我想如果我们能解决它会很好:
template <class T, class X,void (T::*setFunc)(const X&),const X& (T::*getFunc)()const> class property
{
T* const owner;
X data;
friend T;
property(T*const pOwner) : owner (pOwner)
{
}
public:
property& operator = (const X& input){(owner->*setFunc)(input);return *this;}
operator const X&()const {return (owner->*getFunc)();}
};
struct c
{
protected:
void setInt(const int& data);
const int& getInt() const;
public:
c();
property<c, int ,&setInt,&getInt> myInt;
};
c::c() : myInt(this)
{
}
void c::setInt(const int& data)
{
myInt.data = data;
}
const int& c::getInt() …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方法限制为我的情况下使用自定义条件生成模板的代码我想要只在模板类T由类栏继承时调用foo(类似这样)
template <class T:public bar> void foo()
{
// do something
}
Run Code Online (Sandbox Code Playgroud) 我有 C++ 程序将日志文件导出为 HTML 表,我想知道是否有任何方法可以解析该表(类似这样):
<table>
<tr><td>id</td><td>value1</td><td>value2</td></tr>
<tr><td>0 </td><td>0 </td><td>0 </td></tr>
<tr><td>0 </td><td>1.5 </td><td>2.15 </td></tr>
</table>
Run Code Online (Sandbox Code Playgroud)
使用 Javascript 函数转换为 JSON 数组(类似这样):
var chartData = [
{id:"0",value1:"0",value2:"0"},
{id:"1",value1:"1.5",value2:"2.15"}];
Run Code Online (Sandbox Code Playgroud)
问题是我希望这个函数适用于给它的每个表,任何可能的行或列数(第一行总是一个标题)。
我正在将一些对象复制到一个文件中,并且它们都是从同一个类中删除的.但我希望能够在加载它们之后调用它们的函数来执行该类应该执行的操作,这是我迄今为止所做的:
#include <iostream>
#include <fstream>
using namespace std;
struct a
{
virtual void print()
{
cout << "this is a.\n";
};
};
struct b : public a
{
virtual void print()
{
cout << "this is b.\n";
}
};
int main()
{
ofstream testofile("test.bin",ios::binary);
a* tempa = new a;
a* tempb = new b;
testofile.write((char*)tempa,sizeof(a));
testofile.write((char*)tempb,sizeof(b));
testofile.flush();
testofile.close();
ifstream testifile("test.bin",ios::binary);
a* x = (a*)new char[max(sizeof(a),sizeof(b))];
testifile.read((char*)x,sizeof(a));
x->print();
testifile.read((char*)x,sizeof(b));
x->print();
}
Run Code Online (Sandbox Code Playgroud)
我的例子工作正常,但如果我评论保存部分然后运行该程序似乎vtable对新的已修改的应用程序无效(虽然我的代码中的任何内容都没有更改).问题是我的文件管理器类不知道可能从我的基础对象中解脱的所有可能的对象,我想只使用一次调用文件管理器来重建我的所有应用程序结构来加载它.当然,我的每个对象都有自己的保存/加载功能,但是filemanager应该如何猜测适合当前数据块的加载函数在哪里?
c++ ×8
c++11 ×2
templates ×2
algorithm ×1
containers ×1
gcc ×1
javascript ×1
json ×1
lambda ×1
mingw ×1
polymorphism ×1
properties ×1
qt ×1
reference ×1
visual-c++ ×1
vtable ×1