我很擅长使用C++而且我实际上遇到了问题.
我有一些A,B,C类定义如下(PSEUDOCODE)
class A
{
...
DoSomething(B par1);
DoSomething(C par1);
...
}
class B
{
A parent;
...
}
class C
{
A parent;
...
}
Run Code Online (Sandbox Code Playgroud)
问题是 :
怎么做到这个?如果我只是这样做(因为我总是在c#中完成)它会给出错误.我非常理解这个的原因.(如果我将B和C的引用(包含)添加到自己的头中,则尚未声明A)
有什么方法可以解决这个问题吗?(使用void*指针不是去imho的方法)
我正在为学校创建各种数字自动售货机,但遇到了问题。我创建了一个Items自动售货结构。然后,我创建了一个名为的结构Machine,其中包含一个vector<Items>。我想创建一个for循环,该循环遍历vector<Item>并显示项目,但出现以下错误:
C:\Users\Nate\Desktop>g++ structversion.cpp -o structversion.exe -std=c++11
structversion.cpp: In function 'int test(Machine)':
structversion.cpp:29:20: error: 'begin' was not declared in this scope
for (Item item : machine) {
^
structversion.cpp:29:20: note: suggested alternatives:
In file included from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/string:51:0,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/locale_classes.h:40,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/ios_base.h:41,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/ios:42,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/ostream:38,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/iostream:39,
from structversion.cpp:1:
C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/range_access.h:87:5: note: 'std::begin'
begin(_Tp (&__arr)[_Nm])
^
C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/range_access.h:87:5: note: 'std::begin'
structversion.cpp:29:20: error: 'end' was not declared in this scope
for (Item item : machine) { …Run Code Online (Sandbox Code Playgroud) 所以,我有一个宏.
// swap_specialize.hpp
#include <algorithm>
#ifndef STD_SWAP_SPECIALIZE
#define STD_SWAP_SPECIALIZE( CLASSNAME ) \
namespace std { \
template<> inline \
void swap( CLASSNAME & lhs, CLASSNAME & rhs ) \
{ lhs.swap(rhs); } }
#endif
Run Code Online (Sandbox Code Playgroud)
那我就上课了
// c.hpp
#include <vector>
#include "swap_specialize.hpp"
class C
{
public:
C();
void swap(C& rhs)
{
data_.swap(rhs.data_);
}
C& operator=(C rhs)
{
rhs.swap(*this);
return *this;
}
private:
std::vector<int> data_;
}
STD_SWAP_SPECIALIZE(C)
Run Code Online (Sandbox Code Playgroud)
这样做风格上是不好的?这是代码味道吗?或者这是一个好的做法?
HI.
如何在.h文件中定义bool方法并在cpp文件中使用它?我有
my.h
#include <string>
public class me;
class me
{
public:
me();
private bool method(string name); //it is ok??
}
Run Code Online (Sandbox Code Playgroud)
my.cpp
#include 'my.h';
me::me()
{
method(string name); //can i do this? isn't there another alternative?
}
method (String name)
{
cout<<"name"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
不工作.为什么?
在这里,我读了一篇关于何时将指针作为函数参数传递的文章。但是我想知道在某些情况下您应该将指向指针的指针作为函数的参数传递。为了更清楚,我想知道什么时候应该使用类似的东西:
func(int **x);
Run Code Online (Sandbox Code Playgroud) 我按照如何memset char数组与空终止字符?使用C memsetapi 时添加空终止符.
代码有效; 由于null终止符,我不再在malloc'd char数组的末尾添加奇怪的内存中字符.
/* memset does not add a null terminator */
static void yd_vanilla_stars(size_t *number_of_chars, char *chars_to_pad)
{
memset(chars_to_pad, 0, *number_of_chars+1);
memset(chars_to_pad,'*',*number_of_chars);
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式实现同样的目标?
可能重复:
在C++中通过值传递或通过常量引用传递是否更好?
在编写文件系统时我想到了这一点.
vector<string> getFiles(string path);
vector<string> getFiles(const string& path);
Run Code Online (Sandbox Code Playgroud)
什么更快?什么更优雅?
显然path永远不会改变getFiles方法.
额外奖励:我正在使用C++ 11.有没有办法移动语义会加速一切?
我想将一个巨大的stl向量传递给C++中的函数,当我按值传递时,它是否在内部复制了这个巨大的向量?我不清楚传递值和传递引用在内存分配方面有何不同.传递参考更有效率吗?我应该只将一个巨大的向量指针传递给函数,以便节省大量内存吗?
有人可以向我解释以下三种情况的记忆差异吗?假设obj很大.
1. func(vector<obj> )
2. func(vector<obj>*)
3. func(vector<obj*>)
Run Code Online (Sandbox Code Playgroud) 通常,最好将指向结构的指针传递给C中的函数,以避免在函数调用期间进行复制.这具有不希望的副作用,被调用的函数可以无意中修改结构的元素.在不影响函数调用效率的情况下,避免此类错误的良好编程习惯是什么?
这是leetcode上的问题
给定仅包含字符'(',')','{','}','['和']'的字符串,请确定输入字符串是否有效。
括号必须以正确的顺序闭合,“()”和“()[] {}”都是有效的,而“(]”和“([]]”则无效。
这是一个解决方案:
class Solution {
public:
bool isValid(string s) {
stack<char> paren;
for (char& c : s) {
switch (c) {
case '(':
case '{':
case '[': paren.push(c); break;
case ')': if (paren.empty() || paren.top()!='(') return false; else paren.pop(); break;
case '}': if (paren.empty() || paren.top()!='{') return false; else paren.pop(); break;
case ']': if (paren.empty() || paren.top()!='[') return false; else paren.pop(); break;
default: ; // pass
}
}
return paren.empty() ;
}
};
Run Code Online (Sandbox Code Playgroud)
这是另一个解决方案:
class Solution { …Run Code Online (Sandbox Code Playgroud) 新手在这里,我正在阅读一些代码,我看到有时候作者在函数中使用了引用
funca (scalar& a)
// Etc
Run Code Online (Sandbox Code Playgroud)
有时他只是用
funcb (scalar a)
// Etc
Run Code Online (Sandbox Code Playgroud)
有什么不同?使用引用是一个我应该拥有的好习惯吗?
谢谢!