小编use*_*042的帖子

是否有任何有效的用例使用new和delete,原始指针或带有现代C++的c风格数组?

这是一个值得注意的视频(停止教学C)关于教授c ++语言的范式变化.

还有一篇值得关注的博文

我有一个梦想 ...

我梦想着所谓的C++课程/课程/课程将停止教学(要求)他们的学生使用:...

自从C++ 11成为既定标准以来,我们拥有动态内存管理功能,即智能指针.
即使从早期的标准,我们有c ++标准容器库作为原始数组(分配new T[])的良好替代品(特别是使用std::string而不是c风格的NUL终止字符数组).

问题以粗体显示:

抛开放置new覆盖,是否存在使用智能指针或标准容器无法实现的任何有效用例,但仅使用newdelete直接使用(当然,除了实现此类容器/智能指针类)?

有时传言(在这里这里)使用newdelete手动滚动对于某些情况可以"更有效".实际上这些是哪些?这些边缘情况是否需要以与标准容器或智能指针需要相同的方式跟踪分配?

原始c风格的固定大小数组几乎相同:std::array现在,它允许所有类型的分配,复制,引用等轻松和语法一致,如所有人所期望的那样.是否有任何用例选择T myArray[N];c风格的数组而不是std::array<T,N> myArray;


关于与第三方图书馆的互动:

假设第三方库返回使用newlike 分配的原始指针

MyType* LibApi::CreateNewType() {
    return new MyType(someParams);
}
Run Code Online (Sandbox Code Playgroud)

你总是可以将它包装成一个智能指针,以确保delete被调用:

std::unique_ptr<MyType> …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

37
推荐指数
4
解决办法
2470
查看次数

TypeScript中的朋友类

在C++中有一个叫做朋友类的东西.据我所知,TypeScript/JavaScript中没有这样的东西.有没有办法在TypeScript/JavaScript中模拟友元类的这种行为?

举个为什么,什么我尝试做的更好环境(如果需要的话),我做一些小游戏的乐趣(和学习的东西),并尝试做这个.目前我只使用公共方法,一切正常,但我想将这些方法的可访问性限制在另一个类中.我使用TypeScript,如果有帮助的话.

javascript friend-class typescript

12
推荐指数
2
解决办法
4679
查看次数

gdb错误不是可执行格式:无法识别文件格式

我试图在Ubuntu 16.04上调试一个简单的"hello world"C++程序,但是gdb无法识别可执行文件格式.但是,我能够在命令行上成功运行可执行文件.这是代码

#include <iostream>
using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用命令编译程序文件TestProject.cpp

g++ -g TestProject.cpp -o hello
Run Code Online (Sandbox Code Playgroud)

然后调试,我给出命令

gdb ./hello
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying" …
Run Code Online (Sandbox Code Playgroud)

c++ gdb ubuntu-16.04

12
推荐指数
2
解决办法
2万
查看次数

如何指示C++指针的所有权

假设我有一节课:

class Scheduler {
    Scheduler(JobService *service);
    AddJob(JobID id, ISchedule *schedule);
}
Run Code Online (Sandbox Code Playgroud)

构造函数接受指向服务的指针,但Scheduler不接受服务指针的所有权.假定服务指针由调用者释放.

AddJob案例正好相反.计划生存期由调度程序管理,当作业不再需要运行计划时,内存将被释放.

从API的角度来看,目前尚不清楚谁拥有指针的所有权以及谁没有.如果有一些技术可以通过API设计而不是通过文档来表明意图,那我就更聪明了.使它更加简单明了.

如果可以的话,我会构造ISchedule的实例,但它是C++(接口)中的抽象类,因此为每种类型的调度创建Add重载是不切实际的.所以,我必须在Add中加一个指针.

c++ pointers api-design

8
推荐指数
2
解决办法
3298
查看次数

模块化算术 - 竞争性编程

我看到很多有竞争力的程序员用((a + b) % d + d) % dC++ 编写代码.他们为什么不使用(a + b) % d+ d括号里面有什么用?它与负数有关吗?

谢谢

c++ math modular-arithmetic

6
推荐指数
1
解决办法
537
查看次数

给定一个数组找到m个奇数的子数组?

样本输入:( 1 2 3 4 5数组元素) m = 1(奇数)样本输出: 8.子阵列是[ [1],[1,2],[2,3],[2,3,4],[3],[3,4],[4,5],[5]]

这是我的实现.在最坏的情况下,它需要O(n + n ^ 2).是否有任何方法来优化此代码?

int main() {
    int n, *a, count1=0, m, *dp;
    cin>>n;
    a = new int[n];
    dp =new int[n];

    for(int i=0; i<n; i++) {
        cin >> a[i];
    }

    cin >> m;

    for(int i=0; i<n; i++){
        if(a[i]%2==1) {
            count1++;
        }

        dp[i] =count1;
    }

    int prev;
    long count=0;

    for(int i=0; …
Run Code Online (Sandbox Code Playgroud)

c++ arrays algorithm

6
推荐指数
1
解决办法
3057
查看次数

CMake错误:CMake无法找到与“ MinGW Makefiles”相对应的生成程序

我正在尝试使用cmake为c ++构建Box2D库。当我运行cmake gui时,出现错误:

CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)

像这些人一样,大多数问题都通过说“将MinGw / bin添加到PATH”来回答,但我已经在PATH上找到了。还有什么可能导致此错误?

c++ cmake box2d

5
推荐指数
1
解决办法
2万
查看次数

哈希码判断系统过去版本

有没有办法使用过去一届google hash code比赛的裁判系统?我正在练习过去版本的问题陈述,我想计算我提交的分数。

hashcode

5
推荐指数
1
解决办法
548
查看次数

为什么重写虚函数时不考虑访问限定符?

以下代码打印“I'm B!”。这有点奇怪,因为B::foo()是私人的。关于A* ptr我们可以说它的静态类型是Afoo公共的),而它的动态类型是Bfoo私有的)。所以我可以foo通过指向 的指针调用A。但这样我就可以访问B. 是否可以视为违反封装性?

由于访问限定符不是类方法签名的一部分,因此可能会导致这种奇怪的情况。为什么在 C++ 中重写虚函数时不考虑访问限定符?我可以禁止此类情况吗?这个决定背后的设计原则是什么?

活生生的例子

#include <iostream>

class A
{
public:
    virtual void foo()
    {
        std::cout << "I'm A!\n";
    };
};

class B: public A
{
private:
    void foo() override
    {
        std::cout << "I'm B!\n";
    };
};

int main()
{
    A* ptr;
    B b;

    ptr = &b;

    ptr->foo();
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance overriding virtual-functions

5
推荐指数
1
解决办法
365
查看次数

使用const成员对自定义对象的向量进行排序

我想对一个包含const成员变量的类对象的向量进行排序。
不幸的是,我收到一条错误消息,指出“没有匹配函数可调用” swap””

当我删除constfor 的关键字时id,则std::sort()可以同时使用重载operator<()和自定义比较功能。

为什么会这样呢?我通常可以不使用const成员变量对属于类的对象进行排序吗?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct A
{
    const int id;
    A(int id) : id(id) {}
    bool operator<(const A &other) const
    {
        return id < other.id;
    }
};

bool cmp(const A &lhs, const A &rhs)
{
    return lhs.id < rhs.id;
}

int main()
{
    vector<A> vec;
    vec.emplace_back(3);
    vec.emplace_back(0);
    vec.emplace_back(2);
    vec.emplace_back(1);
    std::sort(vec.begin(), vec.end());
    std::sort(vec.begin(), vec.end(), cmp);
}
Run Code Online (Sandbox Code Playgroud)

c++ sorting stl

5
推荐指数
1
解决办法
355
查看次数