5

我是 C++11 的新手,坦率地说,我已经有一年多没有使用 C++了,所以一开始我有点生疏。我正在从我的旧大学课文中做一些练习,并且在尝试迭代 char 指针字符串时遇到了问题(例如:char * c = "a string";)。我无法在 Google 上找到任何有用的信息。我已经习惯了 Java,foreach 循环可以遍历任何集合。我知道指针是如何工作的,但是我从 C++ 度过的漫长假期让我对实际使用它们的语法一无所知。有人能告诉我为什么下面的代码(特别是 convert() 函数)会导致编译错误,其中说“开始”和“结束”没有在这个范围内声明吗?

Ex12_01_RomanType.h

#ifndef EX12_01_ROMANTYPE_H
#define EX12_01_ROMANTYPE_H

class RomanType {
  public:
    RomanType();
    RomanType(char * n);
    virtual ~RomanType();

    char * toString();
    int getValue();
  private:
    char * numeral;
    int decimal;

    void convert();
};

#endif // EX12_01_ROMANTYPE_H

Ex12_01_RomanType.cpp

#include "Ex12_01_RomanType.h"

RomanType::RomanType() {
  // Default Constructor
  numeral = "I";
  decimal = 0;
  convert();
}

RomanType::RomanType(char * n) {
  // Specific Constructor
  numeral = n;
  decimal = 0;
  convert();
}

RomanType::~RomanType() {
  delete numeral;
}

char * RomanType::toString() {
  return numeral;
}

int RomanType::getValue() {
  return decimal;
}

void RomanType::convert() {
  /* Iterates over each character in the numeral string and adds that
     character's value to the decimal value. This method should only
     be called once during the constructor. */
  for(char c : numeral) {
    if(c == 'M') decimal += 1000;
    else if(c == 'D') decimal += 500;
    else if(c == 'C') decimal += 100;
    else if(c == 'L') decimal += 50;
    else if(c == 'X') decimal += 10;
    else if(c == 'V') decimal += 5;
    else if(c == 'I') decimal += 1;
    else decimal += 0;
  }
}

抱歉,如果这个问题对某些人来说似乎很基本。Java 宠坏了我。

4

4 回答 4

8

Range-based-for适用于数组、具有成员beginand的类end,或者当存在适当的非成员beginand时end

如果不一直遍历它,就无法找到c-style 字符串(指向NUL-terminated数组的指针)的“结束”。char

最简单的解决方法就是使用std::string,它将与基于范围的 - 一起使用for

(编辑:现在我想到了,即使char直接使用数组也要小心:

const char myString[] = "Hello";
for ( auto c : myString ) //...

因为您将处理数组的所有6成员,包括NUL-terminator。虽然你不能在这里这样做。)

于 2013-08-02T15:23:05.540 回答
1

Char 没有开始或结束,因此基于范围的 for 循环不适用于 char 类型,请改用较新的std::string

于 2013-08-02T15:26:21.933 回答
0

你已经有了答案。如果您想以 c++11 方式执行此操作,请尝试将所有 char * 替换为 std::string。今天的 c++ 是如果你可以在没有 new/delete 的情况下做你的东西,首先尝试一下。

如果你在罗马数字练习中,这个链接是用漂亮的 c++ 逐步解释小数到罗马 http://jonjagger.blogspot.fr/2013/07/larry-and-jen-do-roman-numerals-in -c.html

于 2013-08-02T19:36:13.457 回答
0

我认为解决问题的最简单方法是使用其范围构造函数创建一个字符串std::string(char* begin, char* end),并在其上调用 for each 循环。

于 2013-08-02T15:26:03.963 回答