我有以下代码:
glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)
但这会让我的程序崩溃.我怎么转换std::string成const char **?我也试过, (const char **)&但它说"需要l值",我不明白.我使用这段代码时工作正常:
const char *data = "some code";
glShaderSource(shader, 1, &data, NULL);
Run Code Online (Sandbox Code Playgroud)
但我不能直接从一个工作std::string.我可以char为它分配一个新数组,但这不是很好的代码.
我也尝试过,const GLchar但显然它没有任何区别.
这段代码很好编译:
extern int i = 10;
void test()
{
std::cout << "Hi" << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
虽然这个错误:
void test()
{
extern int i = 10;
std::cout << "Hi" << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
错误:'我'有'extern'和初始化程序
我读了C++ Primer
包含显式初始值设定项的任何声明都是定义.我们可以在定义为extern的变量上提供初始化器,但这样做会覆盖extern.具有初始化程序的extern是一个定义.在函数内部的extern上提供初始化程序是错误的.
有人可以解释为什么如果在函数本地完成这应该是一个错误,而在全局范围内允许这样做?
我试图定义一个这样的公共静态变量:
public :
static int j=0; //or any other value too
Run Code Online (Sandbox Code Playgroud)
我在这一行得到了一个编译错误:ISO C++禁止非const静态成员`j'的类内初始化.
为什么在C++中不允许这样做?
为什么允许const成员初始化?
这是否意味着C++中的静态变量没有像C一样用0初始化?
谢谢 !
我想在项目中定义一个内联函数,用c99编译.我该怎么做?当我在头文件中声明该函数并在.c文件中提供详细信息时,其他文件无法识别该定义.当我将显式函数放在头文件中时,我遇到了一个问题,因为使用它的所有.o文件都有定义的副本,因此链接器给我一个"多重定义"错误.
我想要做的是:
header.h
inline void func()
{
do things...
}
lib1.c
#include "header.h"
...
lib2.c
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
使用lib1.o和lib2.o的实用程序
我正在阅读JP Mueller和J. Cogswell撰写的"C++ All-in-One for Dummies"并偶然发现:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
Run Code Online (Sandbox Code Playgroud)
这段代码首先初始化所有涉及的东西 - 两个整数和一个指向整数的指针.
只是为了确认,这是一个错误,应该读作'......通过声明',对吧?对我来说,这样的基本错误仍然会出现在书中,这一点很奇怪.
在我正在进行的项目中,我有一个Score类,定义如下score.h.我试图超载它,因此,当对其<<执行操作时,_points + " " + _name打印.
这是我试图做的事情:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
Run Code Online (Sandbox Code Playgroud)
以下是返回的错误:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
Run Code Online (Sandbox Code Playgroud)
(此错误实际出现4次)
我设法通过将重载声明为友元函数来使其工作:
friend ostream & operator<< (ostream & os, Score right);
Run Code Online (Sandbox Code Playgroud)
并Score::从score.cpp中删除函数声明(实际上没有将其声明为成员).
为什么这样做,但前一段代码没有?
谢谢你的时间!
编辑
我删除了头文件上的重载的所有提及...但我得到以下(和唯一)错误.binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or …
我正在尝试使用cpputest构建一个简单的单元测试可执行文件.我已将cpputest框架构建到静态库中,现在正尝试将其链接到可执行文件中.但是,由于相关代码,我陷入了相当复杂的Makefile设置.
这是我的命令行:
/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm
Run Code Online (Sandbox Code Playgroud)
我收到很多错误,如下所示:
Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚造成这种情况的原因.我不是用C++免费获得operator new吗?
我有可能是一个愚蠢的问题,但我只是不理解我的书对它的解释.
它说"当编译器看到模板的定义时,它不会生成代码.它只在我们实例化模板的特定实例时生成代码.事实上代码只在我们使用模板时生成(而不是在我们使用模板时生成定义它)影响我们组织源代码的方式以及何时检测到错误...要生成实例化,编译器需要具有定义函数模板或类模板成员函数的代码.因此,与非模板代码不同,模板的标题通常包括定义和声明."
"生成代码"究竟是什么意思?我想我从来没有真正考虑过编译器发生了什么,并且对它没有太多了解,所以当你编译模板函数或类与非模板函数或类相比时,我不理解它们有什么不同
在有效的C++(第3版),第2项(身高const,enum和inline对#define),为类特定常量代码段读:
class GamePlayer {
private:
static const int NumTurns = 5; // constant declaration
int scores[NumTurns]; // use of constant
...
};
Run Code Online (Sandbox Code Playgroud)
然后,本书(用我自己的话说)static const int NumTurns = 5;不是一个定义,这通常是C++对类成员所要求的,除非它是一个从不使用地址的静态整数常量.如果上面的常量不是真的,或者编译器因任何原因坚持定义,那么定义应该在实现文件中提供如下:
const int GamePlayer::NumTurns; // definition of NumTurns; see
// below for why no value is given
Run Code Online (Sandbox Code Playgroud)
根据这本书(也用我自己的话说),定义中没有给出任何价值,因为它已在声明中给出.
这让我认为我已经知道的声明和定义的定义令人困惑(我在问这个问题之前在Google上仔细检查过):
static const int NumTurns = 5不是定义?是NumTurns不是初始化为5这里的值,是不是当声明和定义一起出现时,它被称为初始化?static积分常数不需要定义?有可能我现在只是在这里混淆自己,所以有人可以从头开始重新教育我:为什么这两行代码声明和定义而不是另一行,那里有任何初始化实例吗?初始化也是定义吗?
信用:代码片段直接从本书中引用.
编辑:附加参考定义和声明之间的区别是什么? …
是否可以在同一.cpp文件中进行类声明和实现?
我想借助mock对象做一些单元测试.以下是我测试的一些示例:
// Some includes removed
#include "abstractconnection.h"
class ConnectionMockup : public AbstractConnection
{
Q_OBJECT
public:
explicit ConnectionMockup(QObject *parent = 0);
bool isReady() const;
void sendMessage(const QString &message);
void test_send_message(const QString &message);
bool ready;
QStringList messages;
};
ConnectionMockup::ConnectionMockup(QObject *parent)
: AbstractConnection(parent)
{
ready = true;
}
bool ConnectionMockup::isReady() const
{
return ready;
}
void ConnectionMockup::sendMessage(const QString &message)
{
messages.append(message);
}
void ConnectionMockup::test_send_message(const QString &message)
{
emit messageRecieved(message);
}
TestEmcProgram::TestEmcProgram(QObject *parent) :
QObject(parent)
{
}
void TestEmcProgram::open()
{
ConnectionMockup mockup;
EmcProgram …Run Code Online (Sandbox Code Playgroud) c++ ×9
declaration ×2
linker ×2
c ×1
c99 ×1
char ×1
class ×1
definition ×1
extern ×1
friend ×1
friend-class ×1
gcc ×1
opengl ×1
qt ×1
static ×1
string ×1
terminology ×1
unit-testing ×1