2014-11-21 122 views
0

我幾乎已經完成了一個程序,它能夠檢測文件中的迴文並輸出一個突出顯示迴文的新文件,但是我被困在一個非常愚蠢的錯誤中。我試圖爲我的一個方法(TDD)編寫一個測試,並且出於某種原因,它不能在範圍內識別該函數。功能在範圍內不被識別

我在我的isPalindromeTest()方法(在PalindromeDetectorTest.h中聲明)中調用了isPalindrome(string s)方法(在PalindromeDetector.h中聲明),但由於某種原因,它並不認爲它是在scoope中。

我覺得所有事情都應該有效,但事實並非如此。任何幫助,你可以提供將不勝感激。下面是我的代碼:

PalindromeDetector.h

#ifndef PALINDROMEDETECTOR_H_ 
#define PALINDROMEDETECTOR_H_ 

#include <iostream> 

using namespace std; 

class PalindromeDetector { 
public: 
void detectPalindromes(); 
bool isPalindrome(string s); 
}; 

#endif /* PALINDROMEDETECTOR_H_ */ 

PalindromeDetector.cpp

#include "PalindromeDetector.h" 
#include "Stack.h" 
#include "ArrayQueue.h" 
#include <iostream> 
#include <fstream> 
#include <cassert> 
#include <cctype> 
#include <string> 

using namespace std; 

void PalindromeDetector::detectPalindromes() { 
    cout << "Enter the name of the file whose palindromes you would like to detect:" << flush; 
    string fileName; 
    cin >> fileName; 
    cout << "Enter the name of the file you would like to write the results to: " << flush; 
    string outFileName; 
    cin >> outFileName; 
    fstream in; 
    in.open(fileName.c_str()); 
    assert(in.is_open()); 
    ofstream out; 
    out.open(outFileName.c_str()); 
    assert(out.is_open()); 
    string line; 
    while(in.good()){ 
     getline(in, line); 
     line = line.erase(line.length()-1); 
     if(line.find_first_not_of(" \t\v\r\n")){ 
      string blankLine = line + "\n"; 
      out << blankLine; 
     } else if(isPalindrome(line)){ 
      string palindromeYes = line + " ***\n"; 
      out << palindromeYes; 
     } else { 
      string palindromeNo = line + "\n"; 
      out << palindromeNo; 
     } 
     if(in.eof()){ 
      break; 
     } 
    } 
    in.close(); 
    out.close(); 
} 

bool PalindromeDetector::isPalindrome(string s){ 
    unsigned i = 0; 
    Stack<char> s1(1); 
    ArrayQueue<char> q1(1); 
    while(s[i]){ 
     char c = tolower(s[i]); 
     if(isalnum(c)){ 
      try{ 
       s1.push(c); 
       q1.append(c); 
      } catch(StackException& se) { 
       unsigned capS = s1.getCapacity(); 
       unsigned capQ = q1.getCapacity(); 
       s1.setCapacity(2*capS); 
       q1.setCapacity(2*capQ); 
       s1.push(c); 
       q1.append(c); 
      } 
     } 
     i++; 
    } 
    while(s1.getSize() != 0){ 
     char ch1 = s1.pop(); 
     char ch2 = q1.remove(); 
     if(ch1 != ch2){ 
      return false; 
     } 
    } 
    return true; 
} 

PalindromeDetectorTest.h

#ifndef PALINDROMEDETECTORTEST_H_ 
#define PALINDROMEDETECTORTEST_H_ 

#include "PalindromeDetector.h" 

class PalindromeDetectorTest { 
public: 
    void runTests(); 
    void detectPalindromesTest(); 
    void isPalindromeTest(); 
}; 

#endif /* PALINDROMEDETECTORTEST_H_ */ 

PalindromeDetectorTest.cpp

#include "PalindromeDetectorTest.h" 
#include <cassert> 
#include <iostream> 
#include <fstream> 
#include <cctype> 
#include <string> 

using namespace std; 

void PalindromeDetectorTest::runTests(){ 
    cout << "Testing palindrome methods... " << endl; 
    detectPalindromesTest(); 
    isPalindromeTest(); 
    cout << "All tests passed!\n" << endl; 
} 

void PalindromeDetectorTest::detectPalindromesTest(){ 
    cout << "- testing detectPalindromes()... " << flush; 
    fstream in; 
    string fileName = "testFile.txt"; 
    in.open(fileName.c_str()); 
    assert(in.is_open()); 
    cout << " 1 " << flush; 
    ofstream out; 
    string fileOutName = "testFileOut.txt"; 
    out.open(fileOutName.c_str()); 
    assert(out.is_open()); 
    cout << " 2 " << flush; 


    cout << " Passed!" << endl; 
} 

void PalindromeDetectorTest::isPalindromeTest(){ 
    cout << "- testing isPalindrome()... " << flush; 
    // test with one word palindrome 
    string s1 = "racecar"; 
    assert(isPalindrome(s1) == true);  // these are not recognized within the scope 
    cout << " 1 " << flush; 
    // test with one word non-palindrome 
    string s2 = "hello"; 
    assert(isPalindrome(s2) == false); // these are not recognized within the scope 
    cout << " 2 " << flush; 
    // test with sentence palindrome 
    string s3 = "O gnats, tango!"; 
    assert(isPalindrome(s3) == true); // these are not recognized within the scope 
    cout << " 3 " << flush; 
    // test with sentence non-palindrome 
    string s4 = "This is not a palindrome."; 
    assert(isPalindrome(s4) == false); // these are not recognized within the scope 
    cout << " 4 " << flush; 

    cout << " Passed!" << endl; 
} 
+1

'isPalindrome'是'PalindromeDetector'的成員函數。你需要一個「PalindromeDetector」對象來調用它。 – dlf 2014-11-21 01:43:18

+0

'while(in.good())'是錯的,你應該直接使用'while(getline(..))'。 – 2014-11-21 01:46:36

回答

0

isPalindromePalindromeDetector成員函數,但是你想從PalindromeDetectorTest方法中調用它。如果從PalindromeDetector派生的測試類可以工作,但它們之間沒有(也幾乎肯定不應該)任何這樣的關係。

您需要一個PalindromeDetector對象來調用該方法。也許只是像這樣簡單:

void PalindromeDetectorTest::isPalindromeTest(){ 
    cout << "- testing isPalindrome()... " << flush; 

    PalindromeDetector sut; // "subject under test" 

    // test with one word palindrome 
    string s1 = "racecar"; 
    assert(sut.isPalindrome(s1) == true); 
    // etc. 
} 

您也可以使PalindromeDetector方法靜態因爲對象不會出現任何狀態。然後你可以直接調用PalindromeDetector::isPalindrome(s1);而不需要創建一個實例。