template <class T>class Array
{
protected :
T* data;
int size;
};
template<class T>class Stack : protected Array<T>
{
int top;
public:
Stack(){};
public:
void Push(T x) {data[++top] = x;}
};
Run Code Online (Sandbox Code Playgroud)
为什么说"数据"未在此范围内声明Push
?我怎样才能解决这个问题?当我删除每个template<T>
,它正常工作.我的模板有问题吗?
基本示例:
class Base
{
public:
double mValue = 10.0;
};
class Derived: public Base
{
public:
double mAdditionalValue = 20.0;
};
int main()
{
Derived derived;
Base *rBase = &derived;
std::cout << "value " << rBase->mValue << '\n';
std::cout << "additionalValue " << rBase->mAdditionalValue << '\n';
}
Run Code Online (Sandbox Code Playgroud)
显然我无法访问mAdditionalValue
via,rBase
因为引用类型(Base
)不是Derived
,并且不包含被调用的成员mAdditionalValue
.太好了!智能机制!但实际上这是用C++实现的?
我的意思是:rBase
无论如何指向一个类型的对象Derived
,并在内存中存储它mAdditionalValue
(我已创建它).所以它指向整个对象.它可以"物理"访问该数据.
谁"阻止/限制"指针范围的可访问性?它在指针的逻辑内(所以是软件实现)还是编译器在编译阶段,捕获它并阻止操作?那会怎么做?检查内存地址并限制它们?
代码:
#include <stdio.h>
typedef struct{
int i;
int tab[];
}mystr;
mystr a = {1,{0,1,2}};
int main(void){
printf("%d%d%d\n",a.i,a.tab[0],a.tab[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C编译:
$ gcc main.c -o main && ./main
101
Run Code Online (Sandbox Code Playgroud)
C++编译:
$ g++ main.c -o main && ./main
main.c:8:27: error: too many initializers for ‘int [0]’
const mystr a = {1,{0,1,2}};
^
Run Code Online (Sandbox Code Playgroud)
我明白这个问题,就是tab
没有分配任何内存.但为什么这对C来说没问题呢?为什么C++不会自动为内存空间分配tab
?我知道结构类似于C++中的对象,但可能有一些我不了解全局对象实例化的细微之处?
// merge.cpp
// merges two containers into a third
#include <iostream>
#include <algorithm> //for merge()
using namespace std;
int src1[] = { 2, 3, 4, 6, 8 };
int src2[] = { 1, 3, 5 };
int dest[8];
int main()
{ //merge src1 and src2 into dest
merge(src1, src1+5, src2, src2+3, dest);
for(int j=0; j<8; j++) //display dest
cout << dest[j] << ' ';
cout << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我键入的代码和我期望的是一个已排序的合并数组,但输出结果如下:
1210537622105376321053763210537642105376521053766210537682105376
Run Code Online (Sandbox Code Playgroud)
我改变了数据,重新检查了语法,但我觉得每件事都很好
我工作的代码库很旧。虽然我们用 c++11 编译几乎所有东西。许多代码是多年前用c 编写的。在旧领域开发新课程时,我总是发现自己必须在匹配旧方法或采用更现代的方法之间做出选择。
在大多数情况下,我更喜欢尽可能坚持使用更现代的技术。然而,我经常看到的一个常见的旧做法是位域,我很难争论它的使用。我们传递了很多消息,很多时候,它们都充满了单个位值。以下面的例子为例:
class NewStructure
{
public:
const bool getValue1() const
{
return value1;
}
void setValue1(const bool input)
{
value1 = input;
}
private:
bool value1;
bool value2;
bool value3;
bool value4;
bool value5;
bool value6;
bool value7;
bool value8;
};
struct OldStructure
{
const bool getValue1() const
{
return value1;
}
void setValue1(const bool input)
{
value1 = input;
}
unsigned char value1 : 1;
unsigned char value2 : 1;
unsigned char value3 : 1;
unsigned …
Run Code Online (Sandbox Code Playgroud) 我正在用c语言编写一个有关动态数组的程序,代码是:
#include <stdio.h>
struct Vector {
int size;
int capacity;
int *arr;
};
void add(struct Vector *Arr, int data) {
if (Arr->size == Arr->capacity) {
Arr->capacity *= 2;
int arr[Arr->capacity];
//array copy
for (int i = 0; i < Arr->size; i++) {
arr[i] = Arr->arr[i];
}
Arr->arr = arr;
}
int size = Arr->size;
Arr->arr[size] = data;
Arr->size++;
}
void display(struct Vector *Arr) {
for (int i = 0; i < Arr->size; i++) {
printf("%d ", Arr->arr[i]);
}
printf("\n");
} …
Run Code Online (Sandbox Code Playgroud) 我使用googletest为我的Android NDK项目包含.c文件.我使用了.cpp类型的测试类来做同样的事情.我想改用.c文件.我尝试使用它时出现以下错误:
Running main() from gtest_main.cc
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (1 ms total)
[ PASSED ] 0 tests.
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
我有几十个f77函数的文件,我想将它们包含在我的f90程序中.我如何与gfortran一起带来它?如果我只是尝试
gfortran myprogram.f90
Run Code Online (Sandbox Code Playgroud)
它抱怨其他文件中的f77代码.据我所知,它希望看到所有文件都符合明确的标准(f90的f77).
在我的cmake C ++项目中,我将源文件添加到目标
file(GLOB HEADERS *.h)
file(GLOB SOURCES *.cpp)
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS})
Run Code Online (Sandbox Code Playgroud)
在macOS中,这包括类似文件,._Source.cpp
而._Header.h
我尝试了REGEX
list(FILTER HEADERS REGEX "^[^\.].+" output_variable HEADERS)
list(FILTER SOURCES REGEX "^[^\.].+" output_variable SOURCES)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。
我正在取 1 到 n 位数字,并找到可被 a 或 b 整除但不能被两者整除的数字计数。我想通过一些逻辑更改来降低此块的时间复杂度。
cin >> n >> a >> b >> k;
for(int i = 1; i <= n; i++) {
if(i % a == 0 && i % b==0) {
count++;
} else if(i % b == 0 && i % a != 0) {
count++;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读苹果文档,其中我遇到了发布方法说明.其中说:
当引用计数达到0时,接收器将发送一个dealloc消息.
那么,我想知道发布方法的定义是什么?是否有检查保留计数的条件?如果保留计数为0,则对象被解除分配?
如果有人提供代码片段会很有帮助.
我在代码审查中注意到以下代码:
for (int i = 0; i < 50; ++i) {
switch(i) {
case 0:
return f1();
case 1:
return f2();
...
case 49:
return f50();
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何优雅的方式,例如使用宏来简化此代码(将其减少到几行):
谢谢.
c++ ×8
c ×4
algorithm ×2
inheritance ×2
bit-fields ×1
boolean ×1
cmake ×1
fortran ×1
fortran77 ×1
fortran90 ×1
gcc ×1
gfortran ×1
googletest ×1
if-statement ×1
macros ×1
merge ×1
objective-c ×1
pointers ×1
polymorphism ×1
regex ×1
stl ×1
templates ×1
unit-testing ×1