最近我一直在仔细研究我的编程风格以及如何改进它.首先让我说,在我目前的职位上,我是唯一的程序员.结果,我可以把事情做成我想要的hacky,但我真的在努力成为一个更好,更健全的程序员.
另外,我的背景主要是基于C的,基本上在必要时使用C++作为C的超集.结果,我偶然发现了以下难题.
我总是用#define ERROR_FUNCTION_BLEW_UP -2定义错误代码.诚实地说,我可以看到这样做的好处,因为我不需要分配内存来存储-2.但是,在C++中,我可以看到使用const变量的好处,因为两个竞争宏之间的冲突机会较少.
结果,我想知道在C++中实现错误代码的最简洁方法是什么.也就是说,我希望客户端能够通过执行类似于"if(return_value == ERROR_FUNCTION_BLEW_UP)"的操作来检查某些函数的返回值.我已经尝试在每个类中添加一个const变量,但是代码看起来不正确.也就是说,客户端现在检查"if(return_value == MyClass.kErrorFunctionBlewUp_)"行.有没有更简洁的方法来实现这一点,而不是让常数成为班上的公共成员?
另外,要添加到我的问题,myClass是一个基类,现在我想在MyDerivedClass中添加更多错误代码.有什么办法解决这个问题并避免使用宏?
感谢大家的帮助.
在下面的程序中,p被声明为一个指针(它是常量BUT字符串不是).但程序仍然无法工作并突然停止说"untitled2.exe已停止工作".
#include<stdio.h>
#include<stdlib.h>
int main(){
char * const p = "hello";
*p = 'm';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种意外
当出现一些问题时,我正在研究一个带有非类型参数的模板函数(以避免数组的动态分配).我的第一个问题是编译时变量赋值.这是因为以下尝试调用模板函数:
template<int n>
int *getDegrees(int A[][n]) {
//return degrees
}
int main(int argc, char **argv) {
int n = 10;
int A[n][n];
int *degs = getDegrees<n>(A);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们有两个错误:第一,编译器无法解析对以下内容的调用getDegrees(A):
main.cc:27: error: no matching function for call to ‘getDegrees(int [(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)][(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)])’
Run Code Online (Sandbox Code Playgroud)
其次,我们无法n在模板调用中使用,因为它不是常量表达式.简单地n保持不变可以解决问题
const int n = 10;
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做的话
int m = 10;
const int n = m;
Run Code Online (Sandbox Code Playgroud)
我们得到了同样的错误.虽然编译器可能允许第二个赋值,但它是否被认为是不好的形式?另外,为什么n在解决函数调用时不断有所作为呢?
我的另一个问题是关于vlas:在堆栈或堆上为它们分配的内存(并且这是依赖于编译器的)?即使在C++中允许它们似乎也存在争议,是否应该避免使用向量(或类似的容器)?
欣赏任何见解!
我想更好地了解如何更改函数签名:
void foo(double x);
Run Code Online (Sandbox Code Playgroud)
至:
void foo(const double x);
Run Code Online (Sandbox Code Playgroud)
如果我们不修改x里面,可能会导致代表编译器的一些优化技巧.有人可以给我一个具体的具体例子吗?
我有以下方法声明:
const String& MyClass::GetAspect(const String& strKey) const
在这个方法中,我们决定在做一些事情之前做一个空指针检查; 如果这个方法里面的指针是null,我们只想返回null.
但是,我收到以下错误:
myclass.cpp(222) : error C2440: 'return' : cannot convert from 'int' to 'const String &'
Reason: cannot convert from 'int' to 'const String'
No constructor could take the source type, or constructor overload resolution was ambiguous
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解吗?是否有一些我不完全理解的const-correctness概念?
此代码无法编译:
ErrorTolerantSearch e;
e.readStringsFromFile("test.txt");
e.buildQgramIndex(3);
vector<map<uint, uint>*> lists;
lists.push_back(&e._qgramIndex["ret"]); // ignore this, assume container not empty
lists.push_back(&e._qgramIndex["coo"]); // ignore this, assume container not empty
map<uint, uint> resunion = e.computeUnion(lists); // <-- this makes problems
Run Code Online (Sandbox Code Playgroud)
这是标题的一部分
class ErrorTolerantSearch {
public:
void readStringsFromFile(string fileName);
void buildQgramIndex(uint q);
map<uint, uint> computeUnion(const vector<const map<uint, uint>*> & lists);
map<string, map<uint, uint> > _qgramIndex;
};
Run Code Online (Sandbox Code Playgroud)
这是编译器给出的错误:
ErrorTolerantSearchTest.cpp: In member function ‘virtual void ErrorTolerantSearchTest_computeUnion_Test::TestBody()’:
ErrorTolerantSearchTest.cpp:89:50: error: no matching function for call to ‘ErrorTolerantSearch::computeUnion(std::vector<std::map<unsigned int, unsigned int>*>&)’
ErrorTolerantSearchTest.cpp:89:50: …Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经使用DEFINE来声明我的常量.它完美无缺.
我试图在我的类中使用c ++ const关键字,但它给出了编译时错误
头
class User{
public:
User::User();
protected:
const float DATA_Z;
}
Run Code Online (Sandbox Code Playgroud)
.CPP
User::User(){
DATA_Z = 0.0023f;
}
Run Code Online (Sandbox Code Playgroud)
这是它产生的错误
错误3错误C2758:'User :: DATA_Z':必须在构造函数base/member初始化列表中初始化
如何为其分配数据,以及如何在课堂上使用它们.
我刚刚开始阅读C++中的模板类,我遇到了一些我不知道的语法.类方法的原型如下:
template <class Type> class Range {
....
bool Below (const Type& value) const;
....
}
Run Code Online (Sandbox Code Playgroud)
并定义为:
template <class Type> bool Range<Type>::Below(const Type& Value) const {
if (Value < Lo) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
在列出方法输入后,任何人都可以帮助我理解'const'标志的含义吗?我明白在输入之前使用时有用,但之后没有.干杯,杰克
template<typename T>
class vector {
vector();
vector(const vector& c);
vector(size_t num, const T& val = T());
~vector();
T& operator[](size_t index);
const T& operator[](size_t index) const;
vector operator=(const vector& v);
T& at(size_t loc);
const T& at(size_t loc) const;
void pop_back();
void push_back(const T& val);
size_t size() const;
};
Run Code Online (Sandbox Code Playgroud) 可以理解,编译器将不允许以下内容:
const int ci = 1000;
int &r = ci;
Run Code Online (Sandbox Code Playgroud)
因为这意味着我可以尝试通过r来改变ci的值,但ci是const.
为什么然后允许以下内容,除了首先为r分配非const int之外,它与上面相同?
int i;
const int ci = 1000;
int &r = i;
r = ci;
Run Code Online (Sandbox Code Playgroud)
如果您尝试通过r更改ci,则ci将保持相同的值.然而,与第一个示例不同,它不会被编译器捕获.对此有解释吗?